Digital Q.DataBase предоставляет два типа данных, предназначенных для поддержки полнотекстового поиска, под которым понимается процесс поиска в коллекции документов на естественном языке документы
с целью нахождения тех, которые лучше всего соответствуют параметру запрос.
Данный tsvector тип представляет собой документ в форме, оптимизированной для текстового поиска; tsquery Тип аналогичным образом представляет текстовый запрос.
Глава 2.9 Содержит подробное описание данного механизма, а также Раздел 2.6.13 содержит сводную информацию о соответствующих функциях и операторах.
tsvector #
Значение tsvector представляет собой отсортированный список уникальных
лексем, представляющих собой слова, прошедшие процесс
нормализации для объединения различных вариантов одного и того же слова
(подробнее см. Глава 2.9 ). Сортировка и удаление дубликатов производятся автоматически при вводе, как показано в данном примере:
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;
tsvector
----------------------------------------------------
'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'
Для представления лексем, содержащих пробелы или знаки препинания, их необходимо заключать в кавычки:
SELECT $$the lexeme ' ' contains spaces$$::tsvector;
tsvector
-------------------------------------------
' ' 'contains' 'lexeme' 'spaces' 'the'
(В этом и следующем примерах используются строковые литералы с долларовыми разделителями, чтобы избежать путаницы при дублировании кавычек внутри литералов). Вложенные кавычки и обратные косые черты должны быть удвоены:
SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector;
tsvector
------------------------------------------------
'Joe''s' 'a' 'contains' 'лексема' 'quote' 'the'
К лексемам могут быть дополнительно привязаны целочисленные позиции:
SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector;
tsvector
------------------------------------------------------------------- ------------
'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4
Позиция обычно указывает на местоположение исходного слова в документе. Информация о позициях может использоваться для ранжирования с учётом близости. Значения позиций могут находиться в диапазоне от 1 до 16383; значения большего размера неявно устанавливаются равными 16383. Дублирующиеся позиции для одной и той же лексемы отбрасываются.
Лексемы, имеющие позиции, могут быть дополнительно помечены
весом, который может принимать значения A,
B, C, или D.
D является значением по умолчанию и поэтому не отображается в выводе:
SELECT 'a:1A fat:2B,4C cat:5D'::tsvector;
tsvector
----------------------------
'a':1A 'cat':5 'fat':2B,4C
Веса обычно используются для отражения структуры документа, например, для отличия слов в заголовках от слов в основном тексте. Функции ранжирования текстового поиска могут назначать различные приоритеты разным маркерам веса.
Важно понимать, что
tsvector тип данных сам по себе не выполняет никакой нормализации слов; предполагается, что передаваемые ему слова уже нормализованы соответствующим для приложения образом. Например,
SELECT 'The Fat Rats'::tsvector;
tsvector
--------------------
'Fat' 'Rats' 'The'
Для большинства приложений полнотекстового поиска на английском языке приведенные выше слова будут считаться ненормализованными, но tsvector не имеет значения.
Текст исходного документа обычно должен быть обработан функцией
to_tsvector для соответствующей нормализации слов
в целях поиска:
SELECT to_tsvector('english', 'The Fat Rats');
to_tsvector
-----------------
'fat':2 'rat':3
Опять же, см. Глава 2.9 для получения более подробной информации.
tsquery #
Значение tsquery значение хранит лексемы, по которым должен осуществляться поиск, и может объединять их с помощью логических операторов
& (AND), | (OR) и
! (NOT), а также оператора поиска фраз
<-> (FOLLOWED BY). Также существует вариант
< оператора FOLLOWED BY, в котором N>N является целой константой, определяющей расстояние между двумя искомыми лексемами. <-> эквивалентно <1>.
Для принудительной группировки этих операторов могут использоваться скобки.
При отсутствии скобок ! (NOT) имеет наивысший приоритет,
<-> (FOLLOWED BY) — следующий приоритет, затем
& (AND), с | (OR), имеющий
самый низкий приоритет.
Примеры использования:
SELECT 'fat & rat'::tsquery;
tsquery
---------------
'fat' & 'rat'
SELECT 'fat & (rat | cat)'::tsquery;
tsquery
---------------------------
'fat' & ( 'rat' | 'cat' )
SELECT 'fat & rat & ! cat'::tsquery;
tsquery
------------------------
'fat' & 'rat' & !'cat'
При необходимости лексемы в tsquery могут быть помечены одной или несколькими весовыми литерами, что ограничивает область поиска только
tsvector лексемами с соответствующими весами:
SELECT 'fat:ab & cat'::tsquery;
tsquery
------------------
'fat':AB & 'cat'
Также лексемы в tsquery могут быть помечены *
для поиска по префиксу:
SELECT 'super:*'::tsquery; tsquery ----------- 'super':*
Этот запрос будет соответствовать любому слову в tsvector которое начинается
с «super».
Правила экранирования для лексем такие же, как были описаны ранее для лексем в tsvector; и, как и в случае с tsvector,
любая необходимая нормализация слов должна быть выполнена перед преобразованием
в тип tsquery . Тип to_tsquery
функция удобна для выполнения такой нормализации:
SELECT to_tsquery('Fat:ab & Cats');
to_tsquery
------------------
'fat':AB & 'cat'
Обратите внимание, что to_tsquery будет обрабатывать префиксы так же, как и другие слова; это означает, что данное сравнение возвращает true:
SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' ); ?column? ---------- t
поскольку postgres преобразуется в основу postgr:
SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' ); to_tsvector | to_tsquery ---------------+------------ 'postgradu':1 | 'postgr':*
который будет соответствовать основе слова postgraduate.