Postgresql полнотекстовый поиск и Django
Postgresql с версии 8.3 поддерживает full text search из коробки. А вещь эта очень полезная и мощная.
В этом посте я приведу пример для английского языка. Но тоже можно сделать и для русского.
Допустим у нас есть следующая модель:
from django.db import models
class Item(models.Model): title = models.CharField(max_length=200) body = models.TextField()
После создания таблицы в базе данных (допустим она называется app_item). Необходимо в неё добавить поле типа tvsector, в котором собственно и будет хранится информация для поиска:
ALTER TABLE app_item ADD COLUMN body_tsv tsvector;
Создадим триггер, используя встроенную процедуру tsvector_update_trigger:
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON app_item
FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(body_tsv, ‘pg_catalog.english’, title, body);
Для поиска мы перечислии 2 поля — title и body. В дальнейшем поиск будет происходит по обоим этим полям.
Теперь нужно создать индекс:
CREATE INDEX app_item_tsv ON search_business USING gin(body_tsv);
Все. Можно использовать full text search! В django для этого придется заюзать extra. Например:
q = 'some query for search' queryset = Item.objects.extra( where=['body_tsv @@ plainto_tsquery(%s)'], params=[q])
Вот мы и получили queryset, и дальше мы его можем использовать как нам удобно. Например добавить некоторые фильтры или отправить данные на страницу.
Стоит отметить, что здесь описаны только самые базовые возможности. Postgresql поддерживает еще много вкусных фич для полнотекстового поиска. Ранжирование, подсветку, и не только.
Comments
Comment form for «Postgresql полнотекстовый поиск и Django»