12.5. Парсеры#
12.5. Парсеры
Парсеры текстового поиска отвечают за разделение исходного текста документа на компоненты и определение типа каждого компонента, где набор возможных типов определяется самим парсером. Обратите внимание, что парсер не изменяет текст вообще — он просто определяет вероятные границы слов. Из-за этого ограниченного функционала, меньше необходимости в приложение-специфичных пользовательских парсерах, чем в пользовательских словарях. В настоящее время Tantor SE предоставляет только один встроенный парсер, который оказался полезным для широкого спектра приложений.
Встроенный парсер называется pg_catalog.default
.
Он распознает 23 типа компонентов, показанных в Таблица 12.1.
Таблица 12.1. Типы компонентов, используемые по умолчанию парсером
Псевдоним | Описание | Пример |
---|---|---|
asciiword | Слово, состоящее только из символов ASCII | elephant |
word | Слово, все буквы | mañana |
numword | Слово, буквы и цифры | beta1 |
asciihword | Слово с дефисом, состоящее только из символов ASCII | up-to-date |
hword | Слово с дефисом, все буквы | lógico-matemática |
numhword | Слово с дефисами, буквами и цифрами | postgresql-beta1 |
hword_asciipart | Часть слова с дефисами, состоящая только из символов ASCII | postgresql в контексте postgresql-beta1 |
hword_part | Часть слова с дефисом, все буквы | lógico-matemática или matemática
в контексте lógico-matemática |
hword_numpart | Часть слова с дефисом, буквы и цифры | beta1 в контексте
postgresql-beta1 |
email | Адрес электронной почты | foo@example.com |
protocol | Заголовок протокола | http:// |
url | URL | example.com/stuff/index.html |
host | Хост | example.com |
url_path | URL путь | /stuff/index.html , в контексте URL |
file | Имя файла или путь | /usr/local/foo.txt , если не является частью URL |
sfloat | Научная нотация | -1.234e56 |
float | Десятичная запись | -1.234 |
int | Знаковое целое число | -1234 |
uint | Беззнаковое целое число | 1234 |
version | Номер версии | 8.3.0 |
tag | XML tag | <a href="dictionaries.html"> |
entity | XML сущность | & |
blank | Пробельные символы | (любые пробелы или знаки пунктуации, не распознаваемые иным образом) |
Примечание
Сущность “буква” воспринимается парсером в соответствии с настройками локали базы данных, а именно с настройкой lc_ctype
. Слова, содержащие только символы основного набора ASCII, отображаются как отдельный тип компонента, поскольку иногда полезно их различать. В большинстве европейских языков типы компонентов word
и asciiword
должны обрабатываться одинаково.
email
не поддерживает все допустимые символы электронной почты, как
определено в RFC 5322.
В частности, единственными поддерживаемыми неалфавитно-цифровыми символами для
имен пользователей электронной почты являются точка, тире и подчеркивание.
Возможно, что парсер может создавать перекрывающиеся компоненты из одного и того же фрагмента текста. В качестве примера, слово с дефисом будет отображаться как весьма слово, так и каждый его компонент:
SELECT alias, description, token FROM ts_debug('foo-bar-beta1'); alias | description | token -----------------+------------------------------------------+--------------- numhword | Hyphenated word, letters and digits | foo-bar-beta1 hword_asciipart | Hyphenated word part, all ASCII | foo blank | Space symbols | - hword_asciipart | Hyphenated word part, all ASCII | bar blank | Space symbols | - hword_numpart | Hyphenated word part, letters and digits | beta1
Это поведение желательно, поскольку оно позволяет выполнять поиск как для всего составного слова, так и для его компонентов. Вот еще один поучительный пример:
SELECT alias, description, token FROM ts_debug('http://example.com/stuff/index.html'); alias | description | token ----------+---------------+------------------------------ protocol | Protocol head | http:// url | URL | example.com/stuff/index.html host | Host | example.com url_path | URL path | /stuff/index.html