tsvector
Используйте тип tsvector
, который является частью функции текстового поиска PostgreSQL.
postgres> select 'What are Q-type Operations?'::tsvector;
tsvector
-------------------------------------
'Operations?' 'Q-type' 'What' 'are'
(1 row)
Вы также можете использовать знакомые операторы в tsvector:
postgres> select 'What are Q-type Operations?'::tsvector
postgres> || 'A.B.C''s of Coding'::tsvector;
?column?
--------------------------------------------------------------
'A.B.C''s' 'Coding' 'Operations?' 'Q-type' 'What' 'are' 'of'
Из документации tsvector:
Значение tsvector представляет собой отсортированный список различных лексем, которые являются словами, которые были нормализованы для объединения различных вариантов одного и того жеслово (подробности см. в главе 12).Сортировка и удаление дубликатов выполняются автоматически во время ввода
Если вы также хотите выполнить нормализацию для конкретного языка, например удалить общие слова ('the', 'a' и т. Д.) И умножения, используйтеto_tsvector
функция.Он также присваивает веса различным словам для текстового поиска:
postgres> select to_tsvector('english',
postgres> 'What are Q-type Operations? A.B.C''s of Coding');
to_tsvector
--------------------------------------------------------
'a.b.c':7 'code':10 'oper':6 'q':4 'q-type':3 'type':5
(1 row)
Полноценный текстовый поиск
Очевидно, что делать это для каждой строки в запросе будет дорого - поэтому вы должны сохранитьtsvector в отдельном столбце и используйте ts_query () для его поиска.Это также позволяет вам создавать индекс GiST для цветографа.
postgres> insert into text (phrase, tsvec)
postgres> values('What are Q-type Operations?',
postgres> to_tsvector('english', 'What are Q-type Operations?'));
INSERT 0 1
Поиск выполняется с использованием tsquery и оператора @@:
postgres> select phrase from text where tsvec @@ to_tsquery('q-type');
phrase
-----------------------------
What are Q-type Operations?
(1 row)