If you are using Djapian please tell us about your project in reply to this post
Use this package to allow full-text search in your Django project.
Versions compatibility matrix:
Notice: there is an old issue with Xapian (< 1.0.13) in mod_python environment. So be careful.
Notice: with 2.2.2 release has been introduced database schema backward-incompatible bug fix -
Change model has switched its
object_id field type from integer to string.
Most of this features provided by Xapian itself and Djapian in this case plays role only as Django-compatible adaptation.
- High-level DSL for indexer declaration
- Result filtering with Django ORM like API
- Result set compatible with standard Django
- Indexing of field, method results and related model attributes
- Entry filtering before indexing (by trigger function)
- Results filtering with boolean lookups support
- Term tagging
- Spelling corrections
- Result ordering by fields
- Indexers auto discovery
- Index shell
- Model changes auto tracking
- Support for different index spaces
Assume that we have this models in our imaginary application:
class Person(models.Model): name = models.CharField(max_length=150) def __unicode__(self): return self.name class Entry(models.Model): author = models.ForeignKey(Person, related_name="entries") title = models.CharField(max_length=250) created_on = models.DateTimeField(default=datetime.now) is_active = models.BooleanField(default=True) text = models.TextField() editors = models.ManyToManyField(Person, related_name="edited_entries") def headline(self): return "%s - %s" % (self.author, self.title) def __unicode__(self): return self.title
And we want to apply indexing functionality for model
Entry. The next step is to create
Indexer instance with proper settings. Indexer may look like this:
import djapian class EntryIndexer(djapian.Indexer): fields=["text"] tags=[ ("author", "author.name" ), ("title", "title", 3), ("date", "created_on" ), ("active", "is_active" ), ("editors", "editors" ) ] trigger=lambda indexer, obj: obj.is_active djapian.space.add_index(Entry, EntryIndexer, attach_as="indexer")
In the django shell create some instances of models:
>>> p = Person.objects.create(name="Alex") >>> Entry.objects.create(author=p, title="Test entry", text="Not large text field") >>> Entry.objects.create(author=p, title="Another test entry", is_active=False) >>> Entry.objects.create(author=p, title="Third small entry", text="Some another text") >>> Entry.indexer.update()
Thats all! Each
Entry instance has been indexed and now ready for search. Let's try:
>>> result = Entry.indexer.search('title:entry') >>> len(result), result.count() 2, 2 >>> for row in result: ... row.percent, row.instance.headline() ... 99 Alex - Test entry 98 Alex - Third small entry
You can follow complete Tutorial for study Djapian basics.