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 | Часть слова с дефисами, только из букв ASCII | postgresql в словосочетании 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 |
файл | Путь или имя файла | /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 | & |
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