×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

2.9.1. Введение

2.9.1.1. Что такое документ?
2.9.1.2. Базовое текстовое соответствие
2.9.1.3. Конфигурации

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

Операторы текстового поиска существуют в базах данных на протяжении многих лет. Digital Q.DataBase поддерживает ~, ~*, LIKE, и ILIKE операторы для текстовых типов данных, однако они не обладают многими важными свойствами, необходимыми современным информационным системам:

  • Лингвистическая поддержка отсутствует даже для английского языка. Регулярных выражений недостаточно, так как они не позволяют эффективно обрабатывать производные формы слов, например, satisfies и satisfy. Вы можете пропустить документы, содержащие satisfies, хотя вы, вероятно, захотите найти их при поиске satisfy. Можно использовать OR для поиска нескольких производных форм, однако это трудоемкий процесс, чреватый ошибками (некоторые слова могут иметь несколько тысяч производных форм).

  • Они не обеспечивают упорядочивания (ранжирования) результатов поиска, что делает их неэффективными в тех случаях, когда найдены тысячи соответствующих документов.

  • Они, как правило, работают медленно из-за отсутствия поддержки индексов, в связи с чем системе приходится обрабатывать все документы при каждом поисковом запросе.

Полнотекстовое индексирование позволяет выполнять предварительную обработку документов и сохранять индекс для последующего быстрого поиска. Предварительная обработка включает следующие этапы:

  • Разбор документов на токены. Целесообразно идентифицировать различные классы токенов (например, числа, простые и составные слова, адреса электронной почты), чтобы обеспечить возможность их различной обработки. В принципе, классы токенов определяются спецификой конкретного приложения, однако в большинстве случаев достаточно использовать стандартный набор классов. Digital Q.DataBase использует парсер для выполнения этого этапа. Система предоставляет стандартный парсер; также могут быть созданы специализированные парсеры для решения конкретных задач.

  • Преобразование токенов в лексемы. Лексема представляет собой строку, аналогично токену, но она прошла процесс нормализованы так, чтобы различные формы одного и того же слова были приведены к единообразному виду. Например, процесс нормализации почти всегда включает в себя приведение прописных букв к строчному регистру и зачастую предполагает удаление суффиксов (таких как s или es на английском языке). Это позволяет осуществлять поиск словоформ одного и того же слова без необходимости утомительного ввода всех возможных вариантов. Кроме того, на данном этапе обычно исключаются стоп-слова, представляющие собой настолько часто встречающиеся слова, что они бесполезны для поиска. (Короче говоря, токены — это необработанные фрагменты текста документа, тогда как лексемы — это слова, отобранные как полезные для индексирования и поиска.) Digital Q.DataBase использует словари для выполнения этого этапа. В системе предусмотрены различные стандартные словари; также могут быть созданы специализированные словари для конкретных задач.

  • Хранение предварительно обработанных документов, оптимизированных для поиска. Например, каждый документ может быть представлен в виде отсортированного массива нормализованных лексем. Наряду с лексемами часто целесообразно хранить информацию о позициях слов для использования при ранжирование с учетом близости слов, благодаря чему документ, содержащий более «плотную» область слов поискового запроса, присваивается более высокий ранг, чем документу с разрозненным расположением искомых слов.

Словари обеспечивают возможность тонкой настройки процесса нормализации токенов. Использование соответствующих словарей позволяет:

  • Определять стоп-слова, которые не должны индексироваться.

  • Сопоставлять синонимы с одним словом, используя Ispell.

  • Сопоставлять фразы с одним словом при помощи тезауруса.

  • Приведение различных вариаций слова к канонической форме с использованием Ispell словарь.

  • Приводить различные формы слова к каноническому виду, используя Snowball правила стеммера.

Тип данных tsvector предусмотрен для хранения предварительно обработанных документов, наряду с типом данных tsquery для представления обработанных запросов (Раздел 2.5.11). Для данных типов данных предусмотрено множество функций и операторов (Раздел 2.6.13), наиболее значимым из которых является оператор соответствия @@, описание которого приведено в Раздел 2.9.1.2. Полнотекстовый поиск может быть ускорен с использованием индексов (Раздел 2.9.9).

2.9.1.1. Что такое документ? #

Документ документ представляет собой единицу поиска в системе полнотекстового поиска; например, это может быть статья в журнале или электронное письмо. Поисковый движок должен обеспечивать синтаксический анализ документов и хранение связей лексем (ключевых слов) с соответствующим документом. В дальнейшем эти связи используются для поиска документов, содержащих слова из поискового запроса.

Для выполнения поиска в Digital Q.DataBase, документ обычно является текстовым полем в строке таблицы базы данных или совокупностью (конкатенацией) таких полей, которые могут быть распределены по нескольким таблицам или формироваться динамически. Иными словами, документ для индексирования может быть составлен из различных фрагментов и не существовать в базе данных в виде единого целого. Например:

SELECT title || ' ' ||  author || ' ' ||  abstract || ' ' || body AS document
FROM messages
WHERE mid = 12;

SELECT m.title || ' ' || m.author || ' ' || m.abstract || ' ' || d.body AS document
FROM messages m, docs d
WHERE m.mid = d.did AND m.mid = 12;

Примечание

На практике в данных примерах запросов coalesce следует использовать, чтобы избежать ситуации, когда наличие единственного NULL атрибута от возникновения NULL NULL-результату для всего документа в целом.

Другим вариантом является хранение документов в виде обычных текстовых файлов в файловой системе. В этом случае базу данных можно использовать для хранения индекса полнотекстового поиска и выполнения поисковых операций, а для получения документа из файловой системы использовать некоторый уникальный идентификатор. Однако извлечение файлов из внешних источников за пределами базы данных требует прав суперпользователя или поддержки специальных функций, поэтому данный подход обычно менее удобен, чем хранение всех данных внутри базы данных Digital Q.DataBase. Кроме того, хранение всех данных непосредственно в базе данных обеспечивает удобный доступ к метаданным документов для упрощения процессов индексирования и отображения.

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

2.9.1.2. Базовое текстовое соответствие #

Полнотекстовый поиск в Digital Q.DataBase основан на операторе соответствия @@, который возвращает значение true в том случае, если tsvector (документ) соответствует tsquery (запросу). Порядок указания типов данных при этом не имеет значения:

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & rat'::tsquery;
 ?column?
----------
 t

SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat rat'::tsvector;
 ?column?
----------
 f

Как показывает приведенный выше пример, tsquery не является просто набором необработанных текстовых данных, равно как и tsvector . Объект tsquery содержит поисковые термы, которые должны представлять собой уже нормализованные лексемы; при этом допускается логическое комбинирование нескольких термов с помощью операторов AND, OR, NOT и FOLLOWED BY. (Подробные сведения о синтаксисе приведены в Раздел 2.5.11.2.) Существуют функции to_tsquery, plainto_tsquery, и phraseto_tsquery , которые позволяют преобразовать введенный пользователем текст в корректное значение tsquery, в первую очередь за счет нормализации входящих в текст слов. Аналогично, функция to_tsvector используется для синтаксического анализа и нормализации строки документа. Таким образом, на практике операция текстового поиска будет выглядеть следующим образом:

SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat');
 ?column?
----------
 t

Обратите внимание, что данное соответствие не было бы найдено, если бы запрос был записан в виде

SELECT 'fat cats ate fat rats'::tsvector @@ to_tsquery('fat & rat');
 ?column?
----------
 f

поскольку в этом случае нормализация слова rats произведена не будет. Элементами типа tsvector являются лексемы, которые предполагаются уже нормализованными, поэтому значение rats не соответствует значению rat.

Оператор @@ также поддерживает текстовые входные данные, что позволяет в простых случаях исключить явное приведение текстовой строки к типу tsvector или tsquery to be skipped in simple cases. Доступны следующие варианты:

tsvector @@ tsquery
tsquery  @@ tsvector
text @@ tsquery
text @@ text

Первые два варианта уже были рассмотрены ранее. Форма текстовые @@ tsquery эквивалентна выражению to_tsvector(x) @@ y. Данная форма текстовые @@ текстовые эквивалентна выражению to_tsvector(x) @@ plainto_tsquery(y).

В рамках tsquery, the & оператор (AND) определяет, что для успешного сопоставления в документе должны присутствовать оба его аргумента. Аналогично, | оператор (OR) указывает на то, что должен присутствовать хотя бы один из его аргументов, в то время как ! оператор (NOT) определяет, что его аргумент не должен содержаться в документе для успешного сопоставления. Например, запрос fat & ! rat соответствует документам, которые содержат fat но не содержат rat.

Поиск фраз возможен с помощью оператора <-> (FOLLOWED BY) tsquery , который обеспечивает совпадение только в том случае, если его аргументы расположены рядом и в заданном порядке. Например:

SELECT to_tsvector('fatal error') @@ to_tsquery('fatal <-> error');
 ?column?
----------
 t

SELECT to_tsvector('error is not fatal') @@ to_tsquery('fatal <-> error');
 ?column?
----------
 f

Существует более общая версия оператора FOLLOWED BY, имеющая следующий вид: <N>, где N — целое число, обозначающее разницу между позициями соответствующих лексем. <1> эквивалентно выражению <->, тогда как <2> допускает наличие ровно одной другой лексемы между искомыми словами и так далее. phraseto_tsquery Функция использует данный оператор для формирования запроса типа tsquery , который позволяет сопоставлять многословные фразы в тех случаях, когда некоторые слова являются стоп-словами. Например:

SELECT phraseto_tsquery('cats ate rats');
       phraseto_tsquery
-------------------------------
 'cat' <-> 'ate' <-> 'rat'

SELECT phraseto_tsquery('the cats ate the rats');
       phraseto_tsquery
-------------------------------
 'cat' <-> 'ate' <2> 'rat'

Частным случаем, который иногда оказывается полезным, является ситуация, когда <0> может использоваться для требования соответствия двух шаблонов одному и тому же слову.

Скобки могут применяться для управления вложенностью tsquery операторов. Без использования скобок | имеет самый низкий приоритет, затем &, затем <->, и ! самый высокий приоритет.

Стоит отметить, что операторы AND/OR/NOT имеют несколько иное значение, когда они находятся внутри аргументов оператора FOLLOWED BY, поскольку в контексте FOLLOWED BY важна точная позиция совпадения. Например, в обычном случае !x соответствует только тем документам, которые не содержат x в любом месте. Однако !x <-> y соответствует y если оно расположено не непосредственно после x; наличие x в другом месте документа не препятствует нахождению совпадения. Другим примером является то, что x & y обычно требует лишь того, чтобы x и y оба терма присутствовали в произвольном месте документа, в то время как (x & y) <-> z требует x и y обеспечения совпадения в той же позиции, непосредственно перед z. Таким образом, поведение данного запроса отличается от x <-> z & y <-> z, который будет соответствовать документу, содержащему две отдельные последовательности x z и y z. (В представленном виде данный запрос не имеет практического смысла, поскольку x и y не может привести к совпадению в той же позиции; однако в более сложных сценариях, таких как поиск по префиксу, запрос подобного формата может оказаться полезным.)

2.9.1.3. Конфигурации #

Все приведенные выше примеры относятся к простому текстовому поиску. Как было отмечено ранее, функциональность полнотекстового поиска предоставляет расширенные возможности: исключение определенных слов из процесса индексирования (стоп-слова), обработку синонимов, а также применение сложных алгоритмов синтаксического анализа (например, разбор текста не только по пробелам). Управление данными функциями осуществляется через конфигурации текстового поиска. Digital Q.DataBase система содержит наборы предопределенных конфигураций для многих языков; также предусмотрена возможность создания пользовательских конфигураций. (psqlинструмент \dF команда отображает все доступные конфигурации).

В процессе установки выбирается подходящая конфигурация, которая default_text_search_config записывается в качестве значения параметра в postgresql.conf. Если для всего кластера баз данных используется единая конфигурация текстового поиска, можно применять значение из postgresql.conf. Для использования различных конфигураций в масштабе кластера при сохранении единой конфигурации в пределах конкретной базы данных используйте команду ALTER DATABASE ... SET. В иных случаях параметр можно определить default_text_search_config индивидуально для каждой сессии.

Каждая функция текстового поиска, работа которой зависит от выбранной конфигурации, имеет необязательный regconfig аргумент, позволяющий явно указать используемую конфигурацию. default_text_search_config используется только в том случае, если данный аргумент опущен.

Для упрощения процесса создания пользовательских конфигураций текстового поиска конфигурация формируется из более простых объектов базы данных. Digital Q.DataBaseсредства текстового поиска предоставляют четыре типа объектов базы данных, относящихся к конфигурации:

  • Парсеры текстового поиска разделяют документы на токены и классифицируют каждый токен (например, как слова или числа).

  • Словари текстового поиска преобразуют токены в нормализованную форму и исключают стоп-слова.

  • Шаблоны текстового поиска предоставляют функции, лежащие в основе словарей. (Словарь просто определяет конкретный шаблон и набор параметров для него.)

  • Конфигурации текстового поиска определяют парсер и набор словарей, используемых для нормализации токенов, полученных в результате работы парсера.

Парсеры и шаблоны текстового поиска строятся на основе низкоуровневых функций языка C; таким образом, разработка новых компонентов требует навыков программирования на языке C, а их установка в базу данных — прав суперпользователя. (Примеры дополнительных парсеров и шаблонов приведены в contrib/ дистрибутива СУБД.) Digital Q.DataBase Поскольку словари и конфигурации лишь параметризуют и связывают воедино базовые парсеры и шаблоны, для создания нового словаря или конфигурации не требуется специальных привилегий. Примеры создания пользовательских словарей и конфигураций приведены далее в текущей главе.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению