12.5. Парсеры#

12.5. Парсеры

12.5. Парсеры #

Парсеры текстового поиска отвечают за разделение исходного текста документа на компоненты и определение типа каждого компонента, где набор возможных типов определяется самим парсером. Обратите внимание, что парсер не изменяет текст вообще — он просто определяет вероятные границы слов. Из-за этого ограниченного функционала, меньше необходимости в приложение-специфичных пользовательских парсерах, чем в пользовательских словарях. В настоящее время Tantor BE предоставляет только один встроенный парсер, который оказался полезным для широкого спектра приложений.

Встроенный парсер называется pg_catalog.default. Он распознает 23 типа компонентов, показанных в Таблица 12.1.

Таблица 12.1. Типы компонентов, используемые по умолчанию парсером

ПсевдонимОписаниеПример
asciiwordСлово, состоящее только из символов ASCIIelephant
wordСлово, все буквыmañana
numwordСлово, буквы и цифрыbeta1
asciihwordСлово с дефисом, состоящее только из символов ASCIIup-to-date
hwordСлово с дефисом, все буквыlógico-matemática
numhwordСлово с дефисами, буквами и цифрамиpostgresql-beta1
hword_asciipartЧасть слова с дефисами, состоящая только из символов ASCIIpostgresql в контексте 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://
urlURLexample.com/stuff/index.html
hostХостexample.com
url_pathURL путь/stuff/index.html, в контексте URL
fileИмя файла или путь/usr/local/foo.txt, если не является частью URL
sfloatНаучная нотация-1.234e56
floatДесятичная запись-1.234
intЗнаковое целое число-1234
uintБеззнаковое целое число1234
versionНомер версии8.3.0
tagXML tag<a href="dictionaries.html">
entityXML сущность&amp;
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