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

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

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

