dvdmgl / django-pg-fts

Implementation PostgeSQL for Full Text Search for Django >= 1.7
http://django-pg-fts.readthedocs.org/
Other
27 stars 13 forks source link

============= django-pg-fts

Implementation PostgeSQL for Full Text Search for django 1.7, taking advantage of new features Migrations and Custom Lookups.

Features:

With multiple dictionary support, index and trigger migrations

How it works

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:

.. code-block:: sql

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:

.. code-block:: sql

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:

.. code-block:: sql

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 <http://django-pg-fts.readthedocs.org/>_.

Documentation

Documentation available in Read The Docs django-pg-fts.readthedocs.org <http://django-pg-fts.readthedocs.org/>_

Installation

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