Многомерный и пространственный поиск
261
необходимо для повышения качества поиска. Например, мы ожидаем, что
слова «слово» и «слова» должны соответствовать одному и тому же терму.
Преобразования нетривиальны: «лечь» и «лягу» – это формы одного и того
же слова, но «лягушка» – совсем другое. И это не просто морфологические
преобразования: значение зависит от контекста.
Например, слова «хост» и «компьютер» имеют одинаковое значение в до-
кументе, описывающем сетевые протоколы, но их смысл различается, когда
речь идет об организации конференции.
В PostgreSQL лингвистические правила, определяющие преобразования,
инкапсулируются в
конфигурацию
. Доступно несколько предопределенных
конфигураций для разных языков, и могут быть определены дополнитель-
ные. Одна из предопределенных конфигураций не зависит от языка и огра-
ничивается простыми преобразованиями.
Результат лингвистической обработки представлен как значение типа
tsvector
. Значения
tsvector
не относятся к какому-либо языку или даже
к текс ту и представляют собой списки термов. Значение типа
tsvector
можно
построить из любого списка значений.
Почему текстовый поиск называется
полнотекстовым
поиском
? Во вре-
мена средневековья (1970-е годы), когда емкость жестких дисков была не-
большой, списки термов составлялись только из заголовков или аннотаций.
Таким образом, «полный текст» означает, что все слова в документе рассмат-
риваются как источник термов.
Похожим образом запрос для поиска документа представлен как значение
типа
tsquery
. Эти текстовые значения могут содержать слова и логические
связки «и», «или» и «не». Простой запрос состоит только из слов.
Документ соответствует такому запросу, если все термы в запросе при-
сутствуют в
tsvector
, соответствующем документу.
Оператор сопоставления
@@
возвращает истину, если документ удовлет-
воряет запросу, и ложь в противном случае. Его можно использовать в пред-
ложении
WHERE
команды
SELECT
или в любом другом месте, где ожидается
логическое выражение.
Булев поиск дает определенные результаты: документ либо соответствует
запросу, либо нет. Но поиск при этом неточный? Да, так и есть. Часть ин-
формации теряется при преобразовании документа в
tsvector
, а часть – при
преобразовании запроса в
tsquery
.
Полнотекстовый поиск работает и без индексов, но PostgreSQL предостав-
ляет специальные типы индексов, которые могут его ускорить. Мы обсудим
эти типы индексов далее в данной главе.
Do'stlaringiz bilan baham: