About |

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 поддерживает еще много вкусных фич для полнотекстового поиска. Ранжирование, подсветку, и не только.

Add post to: Delicious Reddit Slashdot Digg Technorati Google
(already: 2) Comment post

Comments

No comments for this post

Comment form for «Postgresql полнотекстовый поиск и Django»

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image