Implementation PostgeSQL for Full Text Search for django 1.7, taking advantage of new features Migrations and Custom Lookups.
Features:
- FieldLookup's search, isearch, tsquery
- Ranking support with normalization, and weights using annotations
- Migrations classes to help create and remove index's, support for 'gin' or 'gist'
- Migrations classes to help create and remove of trigger's
- Multiple dictionaries support with trigger and FieldLookup's
- Support for python 2.7, 3.3 and 3.4
With multiple dictionary support, index and trigger migrations
For a existing model:
class Article(models.Model): title = models.CharField(max_length=255) article = models.TextField()
You want to have full text search in fields title and article, and make give weight to title of 'A'.
Import TSVectorField:
from pg_fts.fields import TSVectorField
Add to existing TSVectorField to model and tell the fields that you want to index and the dictionary:
fts = TSVectorField(fields=(('title', 'A'), 'article'), dictionary='english')
Create migrations file:
python manage.py makemigrations article
Open the new created migration and import CreateFTSIndexOperation, CreateFTSTriggerOperation, UpdateVectorOperation:
from pg_fts.migrations import (CreateFTSIndexOperation, CreateFTSTriggerOperation, UpdateVectorOperation)
And add to the end of operations:
# update vector for already existing data UpdateVectorOperation( name='Article', field='fts', ), # create trigger for automatic insert and update vector CreateFTSTriggerOperation( name='Article', field='fts' ), # create gin index for vector CreateFTSIndexOperation( name='Article', field='fts', index='gin' )
Make the changes to your database:
python manage.py migrate article
Now you have a full text search performance with a trigger that checks any changes in the tracked fields and updates vector field.
You can search will match all words:
>>> Article.objects.filter(fts__search='waz up')
Will result in sql something like:
tsvector @@ to_tsquery('english', 'waz & up')
Or isearch will match some words:
>>> Article.objects.filter(fts__isearch='waz up')
Will result in sql something like:
tsvector @@ to_tsquery('english', 'waz | up')
But you can make a raw tsquery:
>>> Article.objects.filter(fts__tsquery='waz & !up')
Will result in sql something like:
tsvector @@ to_tsquery('english', 'waz & !up')
And also rank the results with normalization and order:
>>> from pg_fts.ranks import FTSRank
>>> Article.objects.filter(
rank=FTSRank(fts_search='waz up', normalization=[1,3])).order_by('-rank')
For multiple dictionaries and more advanced options, check the documentation.
Documentation available in Read The Docs django-pg-fts.readthedocs.org
Clone from GitHub:
git clone git://github.com/dvdmgl/django-pg-fts.git django-pg-fts
You should run the tests:
python runtests.py
Or running tox for py27, py33, py34:
tox
Install using pip from github:
pip install git+https://github.com/dvdmgl/django-pg-fts
Or using setup.py:
python setup.py