2 Лайфхака: Альтернативы Классическому Поиску В Microsoft Sql Server

Привет, Хабр! Наши друзья из Softpoint подготовили интересную статью о Microsoft SQL Server. В нем рассматриваются два практических примера использования полнотекстового поиска:

  • Поиск по «бесконечным» строкам (например, по комментариям) в отличие от обычного поиска через LIKE;
  • Поиск по номерам документов с префиксами.

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

    Анализируются два подхода: предварительная обработка номера документа и добавление собственной библиотеки разбиения по словам.

Присоединяйтесь к нам!

2 лайфхака: альтернативы классическому поиску в Microsoft SQL Server

предоставляю слово автору Эффективный поиск гигабайт накопленных данных – это своего рода «Святой Грааль» учетных систем.

Все хотят найти его и обрести бессмертную славу, но в процессе поиска раз за разом оказывается, что единого чудо-решения не существует. Ситуация осложняется тем, что пользователи обычно хотят искать по вхождению подстроки — где-то оказывается, что нужный номер контракта «запрятан» в середине комментария; где-то оператор не помнит точно фамилию клиента, но запомнил, что его зовут «Алексей Евграфович»; где-то нужно просто опустить повторяющуюся форму собственности ПОЮБЛ и искать сразу по названию организации.

Для классических реляционных СУБД такой поиск — очень плохая новость.

Чаще всего такой поиск по подстроке сводится к методичному пролистыванию каждой строки таблицы.

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

Радость от поиска решения обычно быстро угасает после беглого анализа существующей практики.

Быстро становится понятно, что, согласно распространенному мнению, полнотекстовый поиск:

  • Сложно настроить
  • Медленно обновляется
  • Зависает система при обновлении
  • Имеет какой-то глупый необычный синтаксис
  • Не находит то, что просят
Набор мифов можно продолжать еще долго, но Платон также научил нас быть скептиками и не принимать слепо чужие мнения на веру.

Давайте разберемся, так ли страшен черт, как его малюют? И прежде чем мы углубимся в исследования, Давайте сразу договоримся о важном условии .

Система полнотекстового поиска может делать гораздо больше, чем обычный строковый поиск.

Например, вы можете составить словарь синонимов и использовать слово «контакт», чтобы найти слово «телефон».

Или искать слова, не учитывая их форму и окончания.

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

То есть, Будем искать только ту подстроку, которая будет указана в строке поиска , без учета синонимов, без приведения слов к «нормальной» форме и прочей магии.



Как работает полнотекстовый поиск MS SQL?

Из основного сервиса СУБД частично удалена функция полнотекстового поиска в MS SQL (ближе к концу статьи мы увидим, почему это может быть крайне полезно).

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

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

Часто таблица уже имеет такой индекс по Primary Key, но иногда его придется создавать дополнительно.

Заполнение индекса полнотекстового поиска происходит асинхронно и вне транзакции.

После изменения строки таблицы она ставится в очередь на обработку.

Процесс обновления индекса берет из строки (строки) таблицы все строковые значения, «подписанные» на индекс, и разбивает их на отдельные слова.

После этого слова можно привести к какому-нибудь «стандартному» виду (например, без окончаний), чтобы облегчить поиск по словоформе.

«Стоп-слова» (предлоги, артикли и другие слова, не имеющие смысла) выбрасываются.

Остальные совпадения ссылок на строки слов записываются в индекс полнотекстового поиска.

Получается, что каждый столбец таблицы, включенный в индекс, проходит через следующий конвейер: Длинная строка -> разделитель слов -> набор частей (слов) -> стеммер -> нормализованные слова -> [необязательно] без стоп-слов -> запись в индекс Как уже говорилось, процесс обновления индекса является асинхронным.

Поэтому:

  1. Обновление не блокирует действия пользователя
  2. Обновление ожидает завершения транзакции изменения строки и начинает применять изменения не раньше, чем произойдет фиксация.

  3. Изменения полнотекстового индекса применяются с некоторой задержкой относительно базовой транзакции.

    То есть между добавлением строки и временем ее обнаружения будет задержка, зависящая от длины очереди обновления индекса.

  4. Количество элементов, содержащихся в индексе, можно отслеживать с помощью следующего запроса:
   

SELECT

Теги: #microsoft #Хранилище данных #sql #Microsoft SQL Server #sql-сервер
Вместе с данным постом часто просматривают: