Полнотекстовый поиск в PostgreSQLЗадача поиска по тексту предполагает работу со сложными индексами и большими объемами данных. Использование стандартных средств, таких как оператор LIKE в СУБД не дает нужных результатов по причине того, что: они не имеют возможность обеспечить поддержку множества форм одного слова; они не предоставляют данных для ранжирования документов; очень медленные, потому что каждый раз просматривают весь документ без индексации. Поэтому для решения этих проблем образовалась целая группа отдельных инструментов. Все технологии полнотекстового поиска работают по одному принципу. На основе текстовых данных строится индекс, который способен очень быстро искать соответствия по ключевым словам. Существует два пути использования полнотекстового поиска: встроенные возможности СУБД и внешние индексаторы. Рассмотрим азы полнотекстового поиска на примере PostgreSQL, в котором есть встроенные механизмы для его организации. Для этого существуют типы данных - tsvector, который является хранилищем для лексем документа, оптимизированноый для поиска, и tsquery - для запроса с поддержкой логических операций. Тип tsvector кроме лексем может хранить информацию о положении лексемы в документе и ее весе (важности), которая потом может использоваться для вычисления ранжирующей информации. Плюс есть полнотекстовый оператор @@ с поддержкой GiST и GIN индексов. GiST-индекс надо использовать для обновляемых данных, а GIN - для статичных архивов. Обусловлено это тем, что GIN индекс быстрее в поиске, но значительно дольше строится, дольше обновляется и имеет больший размер чем GiST. Разбиение данных на обновляемую часть и архив и использование соответствующих индексов, позволяет получать производительный поиск на больших объемах данных с обновляемым контентом. Объекты tsvector и tsquery можно получить при помощи функций to_tsvector и to_tsquery следующим образом:
Пусть у нас есть таблица документов documents, объявленная следующим образом:
Поле tsv содержит tsvector, который оптимизирован для поиска и хранит позиционную информацию лексемы в документе и ее вес, на основе которого мы построим полнотекстовый индекс.
Для поддержания индекса в актуальном состоянии сделаем триггер на добавление и обновление записей:
C помощью функции setweight мы прописали разные веса лексемам из разных частей записи. Теперь можно выполнить полнотекстовых поиск, следующим образом:
Функция rank_cd возвращает ранг документа относительно поискового запроса. Чем выше ранг, тем лучше результат поиска. Для того, чтобы понять какие слова значимы и учитываются в индексе существует функция ts_debug, которая по исходной строке определяет список токенов, используемые словари и результируещие лексемы:
Для получения более детальной информации по используемым словарям можно обратиться к документации по PostgreSQL. 15.09.2016 |
популярные тэги
наука
интересно
новости
технологии
история
go
golang
программирование
it
искусственный интеллект
путешествия
природа
космос
ai
базы данных
медицина
science
анализ текстов
ии
text mining
робототехника
авто
музыка
роботы
интернет
нейронные сети
robots
space
вокруг света
postgresql
алгоритмы
гитара
животные
оружие
google
nosql
авиация
здоровье
техника
auto
|