9.13. Функции и операторы текстового поиска#

9.13. Функции и операторы текстового поиска

9.13. Функции и операторы текстового поиска

Таблица 9.42, Таблица 9.43 и Таблица 9.44 подводят итоги функций и операторов, предоставляемых для полнотекстового поиска. См. Глава 12 для подробного объяснения возможностей полнотекстового поиска в Tantor SE.

Таблица 9.42. Операторы текстового поиска

Оператор

Описание

Пример(ы)

tsvector @@ tsqueryboolean

tsquery @@ tsvectorboolean

Соответствует ли tsvector tsquery? (Аргументы можно указать в любом порядке).

to_tsvector('fat cats ate rats') @@ to_tsquery('cat & rat')t

text @@ tsqueryboolean

Соответствует ли текстовая строка, после неявного вызова функции to_tsvector(), tsquery?

'fat cats ate rats' @@ to_tsquery('cat & rat')t

tsvector @@@ tsqueryboolean

tsquery @@@ tsvectorboolean

Это устаревший синоним для @@.

to_tsvector('fat cats ate rats') @@@ to_tsquery('cat & rat')t

tsvector || tsvectortsvector

Соединяет два tsvector. Если оба входных значения содержат позиции лексем, позиции второго входного значения корректируются соответствующим образом.

'a:1 b:2'::tsvector || 'c:1 d:2 b:3'::tsvector'a':1 'b':2,5 'c':3 'd':4

tsquery && tsquerytsquery

Используется для объединения двух запросов tsquery вместе, создавая запрос, который соответствует документам, соответствующим обоим входным запросам.

'fat | rat'::tsquery && 'cat'::tsquery( 'fat' | 'rat' ) & 'cat'

tsquery || tsquerytsquery

ORs два tsquery вместе, создавая запрос, который соответствует документам, соответствующим любому из входных запросов.

'fat | rat'::tsquery || 'cat'::tsquery'fat' | 'rat' | 'cat'

!! tsquerytsquery

Отрицает tsquery, создавая запрос, который соответствует документам, не соответствующим входному запросу.

!! 'cat'::tsquery!'cat'

tsquery <-> tsquerytsquery

Создает фразовый запрос, который совпадает, если два входных запроса совпадают на последовательных лексемах.

to_tsquery('fat') <-> to_tsquery('rat')'fat' <-> 'rat'

tsquery @> tsqueryboolean

Содержит ли первый tsquery второй? (Это учитывает только то, появляются ли все лексемы в одном запросе в другом, игнорируя комбинирующие операторы).

'cat'::tsquery @> 'cat & rat'::tsqueryf

tsquery <@ tsqueryboolean

Содержится ли первый tsquery во втором? (Это учитывает только то, появляются ли все лексемы, содержащиеся в одном запросе, в другом, игнорируя комбинирующие операторы).

'cat'::tsquery <@ 'cat & rat'::tsqueryt

'cat'::tsquery <@ '!cat & rat'::tsqueryt


В дополнение к этим специализированным операторам, обычные операторы сравнения, показанные в Таблица 9.1, доступны для типов tsvector и tsquery. Они не очень полезны для поиска текста, но позволяют, например, создавать уникальные индексы на столбцах этих типов.

Таблица 9.43. Функции текстового поиска

Функция

Описание

Пример(ы)

array_to_tsvector ( text[] ) → tsvector

Преобразует массив текстовых строк в tsvector. Предоставленные строки используются как лексемы без дополнительной обработки. Элементы массива не должны быть пустыми строками или NULL.

array_to_tsvector('{fat,cat,rat}'::text[])'cat' 'fat' 'rat'

get_current_ts_config ( ) → regconfig

Возвращает OID текущей конфигурации текстового поиска по умолчанию (установленной с помощью default_text_search_config).

get_current_ts_config()english

length ( tsvector ) → integer

Возвращает количество лексем в tsvector.

length('fat:2,4 cat:3 rat:5A'::tsvector)3

numnode ( tsquery ) → integer

Возвращает количество лексем плюс операторов в tsquery.

numnode('(fat & rat) | cat'::tsquery)5

plainto_tsquery ( [ config regconfig, ] query text ) → tsquery

Преобразует текст в tsquery, нормализуя слова в соответствии с указанной или используемой по умолчанию конфигурацией. Любая пунктуация в строке игнорируется (она не определяет операторы запроса). Результативный запрос соответствует документам, содержащим все незапрещенные слова в тексте.

plainto_tsquery('english', 'The Fat Rats')'fat' & 'rat'

phraseto_tsquery ( [ config regconfig, ] query text ) → tsquery

Преобразует текст в tsquery, нормализуя слова в соответствии с указанной или используемой по умолчанию конфигурацией. Все знаки препинания в строке игнорируются (они не определяют операторы запроса). Результативный запрос соответствует фразам, содержащим все незначимые слова в тексте.

phraseto_tsquery('english', 'The Fat Rats')'fat' <-> 'rat'

phraseto_tsquery('english', 'The Cat and Rats')'cat' <2> 'rat'

websearch_to_tsquery ( [ config regconfig, ] query text ) → tsquery

Преобразует текст в tsquery, нормализуя слова в соответствии с указанной или используемой по умолчанию конфигурацией. Последовательности слов в кавычках преобразуются в фразовые тесты. Слово or понимается как оператор ИЛИ, а дефис обозначает оператор НЕ; остальная пунктуация игнорируется. Это приближает поведение некоторых распространенных поисковых инструментов в Интернете.

websearch_to_tsquery('english', '"толстая крыса" или кошка собака')'fat' <-> 'rat' | 'cat' & 'dog'

querytree ( tsquery ) → text

Производит представление индексируемой части tsquery. Результат, который является пустым или только T, указывает на невозможность индексации запроса.

querytree('foo & ! bar'::tsquery)'foo'

setweight ( vector tsvector, weight "char" ) → tsvector

Присваивает указанное значение weight каждому элементу вектора vector.

setweight('fat:2,4 cat:3 rat:5B'::tsvector, 'A')'cat':3A 'fat':2A,4A 'rat':5A

setweight ( vector tsvector, weight "char", lexemes text[] ) → tsvector

Присваивает указанный параметр weight элементам вектора vector, перечисленным в lexemes. Строки в lexemes рассматриваются как лексемы как есть, без дополнительной обработки. Строки, не соответствующие ни одной лексеме в vector, игнорируются.

setweight('fat:2,4 cat:3 rat:5,6B'::tsvector, 'A', '{cat,rat}')'cat':3A 'fat':2,4 'rat':5A,6A

strip ( tsvector ) → tsvector

Удаляет позиции и веса из tsvector.

strip('fat:2,4 cat:3 rat:5A'::tsvector)'cat' 'fat' 'rat'

to_tsquery ( [ config regconfig, ] query text ) → tsquery

Преобразует текст в tsquery, нормализуя слова в соответствии с указанной или используемой по умолчанию конфигурацией. Слова должны быть объединены с помощью допустимых операторов tsquery.

to_tsquery('english', 'The & Fat & Rats')'fat' & 'rat'

to_tsvector ( [ config regconfig, ] document text ) → tsvector

Преобразует текст в tsvector, нормализуя слова в соответствии с указанной или используемой по умолчанию конфигурацией. Информация о позиции включена в результат.

to_tsvector('english', 'The Fat Rats')'fat':2 'rat':3

to_tsvector ( [ config regconfig, ] document json ) → tsvector

to_tsvector ( [ config regconfig, ] document jsonb ) → tsvector

Преобразует каждое строковое значение в JSON-документе в tsvector, нормализуя слова в соответствии с указанной или используемой по умолчанию конфигурацией. Затем результаты объединяются в порядке следования в документе для получения вывода. Информация о позиции генерируется так, как если бы между каждой парой строковых значений существовало одно стоп-слово. (Обратите внимание, что порядок следования в документе полей объекта JSON зависит от реализации при вводе jsonb; обратите внимание на разницу в примерах).

to_tsvector('english', '{"aa": "The Fat Rats", "b": "dog"}'::json)'dog':5 'fat':2 'rat':3

to_tsvector('english', '{"aa": "The Fat Rats", "b": "dog"}'::jsonb)'dog':1 'fat':4 'rat':5

json_to_tsvector ( [ config regconfig, ] document json, filter jsonb ) → tsvector

jsonb_to_tsvector ( [ config regconfig, ] document jsonb, filter jsonb ) → tsvector

Выбирает каждый элемент в запрошенном JSON-документе, указанном в параметре filter, и преобразует каждый из них в tsvector, нормализуя слова в соответствии с указанной или используемой по умолчанию конфигурацией. Затем результаты объединяются в порядке следования в документе для получения вывода. Информация о позиции генерируется так, как если бы между каждой парой выбранных элементов существовал один стоп-слово. (Обратите внимание, что порядок следования в документе полей объекта JSON зависит от реализации при вводе типа jsonb). filter должен быть массивом jsonb, содержащим ноль или несколько из следующих ключевых слов: "string" (для включения всех строковых значений), "numeric" (для включения всех числовых значений), "boolean" (для включения всех логических значений), "key" (для включения всех ключей) или "all" (для включения всех вышеперечисленных). В качестве особого случая filter может быть простым значением JSON, которое является одним из этих ключевых слов.

json_to_tsvector('english', '{"a": "The Fat Rats", "b": 123}'::json, '["string", "numeric"]')'123':5 'fat':2 'rat':3

json_to_tsvector('english', '{"cat": "The Fat Rats", "dog": 123}'::json, '"all"')'123':9 'cat':1 'dog':7 'fat':4 'rat':5

ts_delete ( vector tsvector, lexeme text ) → tsvector

Удаляет все вхождения данного lexeme из vector. Строка lexeme рассматривается как лексема "как есть", без дополнительной обработки.

ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, 'fat')'cat':3 'rat':5A

ts_delete ( vector tsvector, lexemes text[] ) → tsvector

Удаляет все вхождения лексем в lexemes из vector. Строки в lexemes рассматриваются как лексемы без дополнительной обработки. Строки, которые не соответствуют ни одной лексеме в vector, игнорируются.

ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, ARRAY['fat','rat'])'cat':3

ts_filter ( vector tsvector, weights "char"[] ) → tsvector

Выбирает только элементы с заданными weights из vector.

ts_filter('fat:2,4 cat:3b,7c rat:5A'::tsvector, '{a,b}')'cat':3B 'rat':5A

ts_headline ( [ config regconfig, ] document text, query tsquery [, options text ] ) → text

Отображает в сокращенной форме совпадения для query в document, который должен быть необработанным текстом, а не tsvector. Слова в документе нормализуются в соответствии с указанной или используемой по умолчанию конфигурацией перед сопоставлением с запросом. Использование этой функции обсуждается в разделе Раздел 12.3.4, который также описывает доступные options.

ts_headline('Толстый кот съел крысу.', 'кот')The fat <b>cat</b> ate the rat.

ts_headline ( [ config regconfig, ] document json, query tsquery [, options text ] ) → text

ts_headline ( [ config regconfig, ] document jsonb, query tsquery [, options text ] ) → text

Отображает в сокращенной форме совпадения для query, которые встречаются в строковых значениях внутри JSON document. См. Раздел 12.3.4 для получения дополнительной информации.

ts_headline('{"cat":"raining cats and dogs"}'::jsonb, 'cat'){"cat": "raining <b>cats</b> and dogs"}

ts_rank ( [ weights real[], ] vector tsvector, query tsquery [, normalization integer ] ) → real

Вычисляет оценку, показывающую, насколько хорошо вектор vector соответствует запросу. См. Раздел 12.3.3 для получения подробной информации.

ts_rank(to_tsvector('raining cats and dogs'), 'cat')0.06079271

ts_rank_cd ( [ weights real[], ] vector tsvector, query tsquery [, normalization integer ] ) → real

Вычисляет оценку, показывающую насколько хорошо вектор vector соответствует запросу query, используя алгоритм плотности покрытия. См. Раздел 12.3.3 для получения подробной информации.

ts_rank_cd(to_tsvector('raining cats and dogs'), 'cat')0.1

ts_rewrite ( query tsquery, target tsquery, substitute tsquery ) → tsquery

Заменяет все вхождения target на substitute внутри query. См. Раздел 12.4.2.1 для получения подробной информации.

ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'foo|bar'::tsquery)'b' & ( 'foo' | 'bar' )

ts_rewrite ( query tsquery, select text ) → tsquery

Заменяет части запроса query в соответствии с целями и заменами, полученными при выполнении команды SELECT. См. Раздел 12.4.2.1 для получения подробной информации.

SELECT ts_rewrite('a & b'::tsquery, 'SELECT t,s FROM aliases')'b' & ( 'foo' | 'bar' )

tsquery_phrase ( query1 tsquery, query2 tsquery ) → tsquery

Создает фразовый запрос, который ищет совпадения query1 и query2 в последовательных лексемах (то же самое, что и оператор <->).

tsquery_phrase(to_tsquery('fat'), to_tsquery('cat'))'fat' <-> 'cat'

tsquery_phrase ( query1 tsquery, query2 tsquery, distance integer ) → tsquery

Создает фразовый запрос, который ищет совпадения для query1 и query2, которые находятся точно distance лексем друг от друга.

tsquery_phrase(to_tsquery('fat'), to_tsquery('cat'), 10)'fat' <10> 'cat'

tsvector_to_array ( tsvector ) → text[]

Преобразует tsvector в массив лексем.

tsvector_to_array('fat:2,4 cat:3 rat:5A'::tsvector){cat,fat,rat}

unnest ( tsvector ) → setof record ( lexeme text, positions smallint[], weights text )

Расширяет tsvector в набор строк, по одной на каждый лексему.

select * from unnest('cat:3 fat:2,4 rat:5A'::tsvector)

 lexeme | positions | weights
--------+-----------+---------
 cat    | {3}       | {D}
 fat    | {2,4}     | {D,D}
 rat    | {5}       | {A}


Примечание

Все функции полнотекстового поиска, которые принимают необязательный аргумент regconfig, будут использовать конфигурацию, указанную в default_text_search_config при не указании этого аргумента.

Функции в Таблица 9.44 перечислены отдельно, потому что они обычно не используются в повседневных операциях поиска текста. Они в основном полезны для разработки и отладки новых конфигураций поиска текста.

Таблица 9.44. Функции отладки текстового поиска

Функция

Описание

Пример(ы)

ts_debug ( [ config regconfig, ] document text ) → setof record ( alias text, description text, token text, dictionaries регсловарь[], dictionary регсловарь, lexeme text[] )

Извлекает и нормализует компоненты из document в соответствии с указанной или используемой по умолчанию конфигурацией полнотекстового поиска и возвращает информацию о том, как каждый компонент был обработан. См. Раздел 12.8.1 для получения подробной информации.

ts_debug('english', 'Самые яркие сверхновые')(asciiword,"Word, all ASCII",The,{english_stem},english_stem,{}) ...

ts_lexize ( dict regdictionary, token text ) → text[]

Возвращает массив заменяющих лексем, если входной компонент известен словарю, или пустой массив, если компонент известен словарю, но является стоп-словом, или NULL, если это неизвестное слово. См. Раздел 12.8.3 для получения дополнительной информации.

ts_lexize('english_stem', 'stars'){star}

ts_parse ( parser_name text, document text ) → setof record ( tokid integer, token text )

Извлекает компоненты из document с использованием указанного парсера. Подробности см. в разделе Раздел 12.8.2.

ts_parse('default', 'foo - bar')(1,foo) ...

ts_parse ( parser_oid oid, document text ) → setof record ( tokid integer, token text )

Извлекает компоненты из document с использованием указанного идентификатора парсера. Подробности см. в разделе Раздел 12.8.2.

ts_parse(3722, 'foo - bar')(1,foo) ...

ts_token_type ( parser_name text ) → setof record ( tokid integer, alias text, description text )

Возвращает таблицу, которая описывает каждый тип компонента, который может распознать указанный парсер. См. Раздел 12.8.2 для получения подробной информации.

ts_token_type('default')(1,asciiword,"Word, all ASCII") ...

ts_token_type ( parser_oid oid ) → setof record ( tokid integer, alias text, description text )

Возвращает таблицу, которая описывает каждый тип компонента, который может распознать парсер, указанный по OID. См. Раздел 12.8.2 для получения подробной информации.

ts_token_type(3722)(1,asciiword,"Word, all ASCII") ...

ts_stat ( sqlquery text [, weights text ] ) → setof record ( word text, ndoc integer, nentry integer )

Выполняет sqlquery, который должен возвращать один столбец tsvector, и возвращает статистику о каждом отдельном лексеме, содержащейся в данных. См. Раздел 12.4.4 для получения подробной информации.

ts_stat('SELECT vector FROM apod')(foo,10,15) ...