• 19 Май
  • 2015
Делаем полнотекстовый поиск на Django - простой путь

Для реализации полнотекстового поиска будем использовать библиотеку djorm-ext-pgfulltext

Установка


pip install djorm-ext-pgfulltext

Нужно отметить, что библиотека предназначена для PostgreSQL.

Использование

Допустим у нас есть некая модель Product, по которой мы хотим организовать поиск:


class Product(models.Model):
    name = models.CharField(max_length=128)
    slug = models.SlugField(max_length=128, unique=True, default="", blank=True)
    description = models.TextField()
    category = models.ForeignKey(Category)

Все, что нам нужно - поле, которое выступит в роли tsvector и менеджер запросов, конструктор которого принимает некоторые опции:


    search_index = VectorField()
    objects = SearchManager(
        fields=('name', 'description', ),
        config='pg_catalog.russian',
        search_field='search_index',
        auto_update_search_field=True
    )

fields - кортеж полей, из которых будет строиться tsvector;

config - указывает PostgreSQL на словарь, с которым нужно работать;

search_field - поле, в котором находится подготовленный tsvector;

auto_update_search_field - флаг, который при изменении записи пересоздает search_field.

Индексы

Для ускорения работы поиска нужно создать GIN индекс:


CREATE INDEX fts_tsvector_gin_idx ON product USING GIN(search_index)
comments powered by Disqus