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

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

Этот встроенный анализатор называется 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 Часть слова с дефисами, только из букв ASCIIpostgresql в словосочетании postgresql-beta1
hword_part Часть слова с дефисами, из любых буквlógico или 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 <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