Поведение пользовательской конфигурации текстового поиска может со временем стать неочевидным. Функции, описанные в данном разделе, полезны для тестирования объектов текстового поиска. Вы можете протестировать конфигурацию целиком либо проверить работу парсеров и словарей по отдельности.
Функция ts_debug позволяет упростить процесс тестирования конфигурации текстового поиска.
ts_debug([configregconfig, ]документтекстовые, OUTaliasтекстовые, OUTdescriptionтекстовые, OUTтокентекстовые, OUTсловариregdictionary[], OUTсловарьregdictionary, OUTлексемыtext[]) возвращает набор записей типа record
ts_debug отображает информацию о каждом токене
документ , полученном парсером и обработанном настроенными словарями. При этом используется конфигурация, заданная в config,
или default_text_search_config если данный аргумент не указан.
ts_debug возвращает по одной строке для каждого токена, идентифицированного в исходном тексте парсером. Функция возвращает следующие столбцы:
alias текстовые — краткое наименование типа токена
description текстовые — описание
типа токена
токен текстовые — текстовое содержимое токена
словари regdictionary[] — the
словари, выбранные в конфигурации для данного типа токена
словарь regdictionary — словарь
, распознавший токен, или NULL если ни один словарь не обработал токен
лексемы text[] — лексемы, сформированные
словарем, который распознал токен, или NULL если
ни один из них не подошел; пустой массив ({}) означает, что токен был распознан как
стоп-слово
Ниже приведен простой пример:
SELECT * FROM ts_debug('english', 'a fat cat sat on a mat - it ate a fat rats');
alias | description | токен | словари | словарь | лексемы
-----------+-----------------+-------+----------------+--------------+---------
asciiword | Слово, все символы ASCII | a | {english_stem} | english_stem | {}
blank | Пробельные символы | | {} | |
asciiword | Слово, все символы ASCII | fat | {english_stem} | english_stem | {fat}
blank | Пробельные символы | | {} | |
asciiword | Слово, все символы ASCII | cat | {english_stem} | english_stem | {cat}
blank | Пробельные символы | | {} | |
asciiword | Слово, все символы ASCII | sat | {english_stem} | english_stem | {sat}
blank | Пробельные символы | | {} | |
asciiword | Слово, все символы ASCII | on | {english_stem} | english_stem | {}
blank | Пробельные символы | | {} | |
asciiword | Слово, все символы ASCII | a | {english_stem} | english_stem | {}
blank | Пробельные символы | | {} | |
asciiword | Слово, все символы ASCII | mat | {english_stem} | english_stem | {mat}
blank | Пробельные символы | | {} | |
blank | Пробельные символы | - | {} | |
asciiword | Слово, все символы ASCII | it | {english_stem} | english_stem | {}
blank | Пробельные символы | | {} | |
asciiword | Слово, все символы ASCII | ate | {english_stem} | english_stem | {ate}
blank | Пробельные символы | | {} | |
asciiword | Слово, все символы ASCII | a | {english_stem} | english_stem | {}
blank | Пробельные символы | | {} | |
asciiword | Слово, все символы ASCII | fat | {english_stem} | english_stem | {fat}
blank | Пробельные символы | | {} | |
asciiword | Слово, все символы ASCII | rats | {english_stem} | english_stem | {rat}
Для более подробной демонстрации сначала создадим public.english конфигурацию текстового поиска и
словарь Ispell для английского языка:
CREATE TEXT SEARCH CONFIGURATION public.english ( COPY = pg_catalog.english );
CREATE TEXT SEARCH DICTIONARY english_ispell (
TEMPLATE = ispell,
DictFile = english,
AffFile = english,
StopWords = english
);
ALTER TEXT SEARCH CONFIGURATION public.english
ALTER MAPPING FOR asciiword WITH english_ispell, english_stem;
SELECT * FROM ts_debug('public.english', 'The Brightest supernovaes');
псевдоним | описание | токен | словари | словарь | лексемы
-----------+-----------------+-------------+-------------------------------+----------------+-------------
asciiword | Слово, все символы ASCII | The | {english_ispell,english_stem} | english_ispell | {}
blank | Пробельные символы | | {} | |
asciiword | Word, all ASCII | Brightest | {english_ispell,english_stem} | english_ispell | {bright}
blank | Пробельные символы | | {} | |
asciiword | Word, all ASCII | supernovaes | {english_ispell,english_stem} | english_stem | {supernova}
В данном примере слово Brightest было распознано
парсером как ASCII-слово (псевдоним asciiword).
Для данного типа токена определен следующий список словарей:
english_ispell и
english_stem. Слово было успешно обработано словарем
english_ispell, который нормализовал его до существительного
bright. Слово supernovaes является
неизвестным для english_ispell словаря, поэтому оно было передано следующему словарю и успешно распознано (по сути, english_stem представляет собой словарь Snowball, который
обрабатывает любые токены; именно поэтому он был помещен в конец списка словарей).
Слово The было распознано
english_ispell словарём как стоп-слово (Раздел 2.9.6.1) и не будет проиндексировано. Пробелы также отбрасываются, поскольку в данной конфигурации для них не определены словари.
Ширину вывода можно уменьшить, явно указав необходимые столбцы:
SELECT alias, token, dictionary, lexemes
FROM ts_debug('public.english', 'The Brightest supernovaes');
alias | token | dictionary | lexemes
-----------+-------------+----------------+-------------
asciiword | The | english_ispell | {}
blank | | |
asciiword | Brightest | english_ispell | {bright}
blank | | |
asciiword | supernovaes | english_stem | {supernova}
Следующие функции позволяют выполнять прямое тестирование парсера текстового поиска.
ts_parse(parser_nameтекстовые,документтекстовые, OUTtokidinteger, OUTтокентекстовые) возвращаетsetof recordts_parse(parser_oidoid,документтекстовые, OUTtokidinteger, OUTтокентекстовые) возвращаетsetof record
ts_parse выполняет парсинг заданной документ
и возвращает набор записей, по одной для каждого токена, полученного в процессе парсинга. Каждая запись включает поле tokid отображающая назначенный тип токена и токен представляющий собой исходный текст токена. Например:
SELECT * FROM ts_parse('default', '123 - a number');
tokid | token
-------+--------
22 | 123
12 |
12 | -
1 | a
12 |
1 | number
ts_token_type(parser_nameтекстовые, OUTtokidinteger, OUTaliasтекстовые, OUTdescriptionтекстовые) возвращаетsetof recordts_token_type(parser_oidoid, OUTtokidinteger, OUTaliasтекстовые, OUTdescriptionтекстовые) возвращаетsetof record
ts_token_type возвращает таблицу, которая описывает каждый тип токена, распознаваемый указанным парсером. Для каждого типа токена в таблице приводится целочисленный идентификатор tokid используемый парсером для маркировки токена данного типа, alias определяющий имя типа токена в командах настройки, а также краткое description. Например:
SELECT * FROM ts_token_type('default');
tokid | alias | описание
-------+-----------------+------------------------------------------
1 | asciiword | Слово, все символы ASCII
2 | word | Слово, состоящее только из букв
3 | numword | Слово, состоящее из букв и цифр
4 | email | Адрес электронной почты
5 | url | URL-адрес
6 | host | Имя узла (хост)
7 | sfloat | Число в научной нотации
8 | version | Номер версии
9 | hword_numpart | Часть составного слова (через дефис), буквы и цифры
10 | hword_part | Часть составного слова (через дефис), только буквы
11 | hword_asciipart | Часть составного слова (через дефис), все символы ASCII
12 | blank | Пробельные символы
13 | tag | XML-тег
14 | protocol | Заголовок протокола
15 | numhword | Составное слово (через дефис), буквы и цифры
16 | asciihword | Составное слово (через дефис), все символы ASCII
17 | hword | Составное слово (через дефис), только буквы
18 | url_path | Путь URL
19 | файл | Имя файла или пути
20 | число с плавающей точкой | Десятичная форма записи
21 | целое число | Целое число со знаком
22 | безнаковое целое число | Беззнаковое целое число
23 | сущность | XML-сущность
Оператор ts_lexize Данная функция упрощает процесс тестирования словарей.
ts_lexize(словарьregdictionary,токентекстовые) возвращаетtext[]
ts_lexize возвращает массив лексем, если входное значение
токен известно словарю,
или пустой массив, если токен
известен словарю, но является стоп-словом, либо
NULL если слово не распознано.
Примеры:
SELECT ts_lexize('english_stem', 'stars');
ts_lexize
-----------
{star}
SELECT ts_lexize('english_stem', 'a');
ts_lexize
-----------
{}
Семейство ts_lexize функция ожидает одиночный токен
токен, а не текстовую строку. Ниже приведен пример
ситуации, которая может вызвать затруднение:
SELECT ts_lexize('thesaurus_astro', 'supernovae stars') is null;
?column?
----------
t
Словарь-тезаурус thesaurus_astro распознает данную
фразу сверхновые звезды, однако ts_lexize
вызов завершается неудачей, поскольку функция не выполняет парсинг входного текста, а обрабатывает его как единый токен. Используйте plainto_tsquery или to_tsvector для
тестирования словарей-тезаурусов, например:
SELECT plainto_tsquery('supernovae stars');
plainto_tsquery
-----------------
'sn'