12.5. Анализаторы

Задача анализаторов текста — разделить текст документа на фрагменты и присвоить каждому из них тип из набора, определённого в самом анализаторе. Заметьте, что анализаторы не меняют текст — они просто выдают позиции предполагаемых слов. Вследствие такой ограниченности их функций, собственные специфические анализаторы бывают нужны гораздо реже, чем собственные словари. В настоящее время в PostgreSQL есть только один встроенный анализатор, который может быть полезен для широкого круга приложений.

Этот встроенный анализатор называется pg_catalog.default. Он распознаёт 23 типа фрагментов, перечисленные в Таблице 12-1.

Таблица 12-1. Типы фрагментов, выделяемых стандартным анализатором

ПсевдонимОписаниеПример
asciiwordСлово только из букв ASCIIelephant
wordСлово из любых буквmañana
numwordСлово из букв и цифрbeta1
asciihwordСлово только из букв ASCII с дефисамиup-to-date
hwordСлово из любых букв с дефисамиlógico-matemática
numhwordСлово из букв и цифр с дефисамиpostgresql-beta1
hword_asciipartЧасть слова с дефисами, только из букв ASCIIpostgresql в словосочетании postgresql-beta1
hword_partЧасть слова с дефисами, из любых буквlógico или 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_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<a href=​"dictionaries.html">
entityСущность XML&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