Поделиться через


Компонент Full-Text Search (SQL Server)

В SQL Server полнотекстовый поиск позволяет приложениям и пользователям выполнять полнотекстовые запросы к символьным данным из таблиц SQL Server. Перед выполнением полнотекстовых запросов на данной таблице администратор базы данных должен создать в таблице полнотекстовый индекс. В полнотекстовый индекс включается один или несколько символьных столбцов в таблице. Эти столбцы могут иметь любой из следующих типов данных: char, varchar, nchar, nvarchar, text, ntext, image, xml или varbinary(max) и FILESTREAM. Каждый полнотекстовый индекс индексирует один или несколько столбцов таблицы, а каждому столбцу может соответствовать определенный язык.

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

ПримечаниеПримечание

Full-Text Search является необязательным компонентом компонента SQL Server Database Engine. Дополнительные сведения см. в разделе Установка SQL Server 2012.

В этом разделе

  • Что можно сделать с помощью полнотекстового индекса?

    • Запросы полнотекстового поиска

    • Сравнение LIKE с полнотекстовым поиском

  • Компоненты и архитектура полнотекстового поиска

    • Процесс SQL Server

    • Процесс узла управляющей программы фильтрации

  • Обработка полнотекстового поиска

    • Процесс полнотекстового индексирования

    • Обработка полнотекстовых запросов

  • Лингвистические компоненты и поддержка языков в полнотекстовом поиске

  • Связанные задачи

  • См. также

Что можно сделать с помощью полнотекстового индекса?

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

[В начало]

Запросы полнотекстового поиска

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

  • Одно или несколько конкретных слов или фраз (простое выражение).

  • Слова, начинающиеся заданным текстом, или фразы с такими словами (префиксные выражения).

  • Словоформы конкретного слова (производное выражение).

  • Слова или фразы, находящиеся рядом с другими словами или фразами (выражения с учетом расположения).

  • Синонимические формы конкретного слова (тезаурус).

  • Слова или фразы со взвешенными значениями (взвешенное выражение)

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

Все полнотекстовые запросы используют небольшой набор предикатов Transact-SQL (CONTAINS и FREETEXT) и функций (CONTAINSTABLE и FREETEXTTABLE). Однако точная структура полнотекстовых запросов определяется целями поиска данного бизнес-сценария. Например.

  • Электронный бизнес — поиск продукта на веб-сайте:

    SELECT product_id FROM products WHERE CONTAINS(product_description, ”Snap Happy 100EZ” OR FORMSOF(THESAURUS,’Snap Happy’) OR ‘100EZ’) AND product_cost<200 …
    
  • Сценарий комплектования штата — поиск кандидатов, имеющих опыт работы с SQL Server:

    SELECT candidate_name,SSN FROM candidates WHERE CONTAINS(candidate_resume,”SQL Server”) AND candidate_division =DBA
    

Дополнительные сведения см. в разделе Запрос с полнотекстовым поиском.

[В начало]

Сравнение LIKE с полнотекстовым поиском

В отличие от полнотекстового поиска, предикат LIKE в Transact-SQL работает только с комбинациями символов. Кроме того, предикат LIKE нельзя использовать в запросах к форматированным двоичным данным. Более того, запрос с предикатом LIKE к большому количеству неструктурированных текстовых данных выполняется гораздо медленнее, чем эквивалентный полнотекстовый запрос к тем же данным. Выполнение запроса LIKE к нескольким миллионам строк текстовых данных может занять несколько минут, в то время как полнотекстовый запрос к тем же данным занимает всего несколько секунд или даже меньше, в зависимости от количества возвращаемых строк.

[В начало]

Компоненты и архитектура полнотекстового поиска

Архитектура полнотекстового поиска состоит из следующих процессов.

  • Процесс SQL Server (sqlservr.exe).

  • Процесс узла управляющей программы фильтрации (fdhost.exe).

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

Эти два процесса содержат компоненты архитектуры полнотекстового поиска. Эти компоненты и их связи приведены на следующей иллюстрации. Описание компонентов приведено после иллюстрации.

архитектура полнотекстового поиска

[В начало]

Процесс SQL Server

В полнотекстовом поиске используются следующие компоненты процесса SQL Server.

  • Пользовательские таблицы. В этих таблицах содержатся данные, по которым осуществляется полнотекстовое индексирование.

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

  • Файлы тезауруса. Эти файлы содержат синонимы искомых терминов. Дополнительные сведения см. в разделе Настройка и управление файлами тезауруса для полнотекстового поиска.

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

  • SQL Server обработчик запросов. Обработчик запросов компилирует и выполняет SQL-запросы. Если SQL-запрос включает запрос полнотекстового поиска, то запрос направляется в средство полнотекстового поиска как в процессе компиляции, так и при выполнении. Результат запроса сопоставляется с полнотекстовым индексом.

  • Средство полнотекстового поиска. Средство полнотекстового поиска в SQL Server полностью интегрировано в обработчик запросов. Средство полнотекстового поиска предназначено для компилирования и выполнения полнотекстовых запросов. Как часть выполнения запроса средство полнотекстового поиска может получать входные данные из тезауруса и списка стоп-слов.

  • Модуль записи индекса (индексатор). Модуль записи индекса строит структуру, используемую для хранения индексированных токенов.

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

[В начало]

Процесс узла управляющей программы фильтрации

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

Существуют следующие компоненты узла управляющей программы фильтрации.

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

  • Фильтры. Для некоторых типов данных требуется фильтрация перед полнотекстовой индексацией данных в документе, в том числе для данных в столбцах varbinary, varbinary(max), image или xml. Фильтр, используемый для данного документа, зависит от типа этого документа. Например, для документов Microsoft Word (DOC), Microsoft Excel (XLS) и XML-документов (XML) используются разные фильтры. Затем фильтр выделяет из документа фрагменты данных, при этом удаляется внедренное форматирование, остается текст и, возможно, сведения о положении текста. Результатом является поток текстовых данных. Дополнительные сведения см. в разделе Настройка и управление фильтрами для поиска.

  • Средства разбиения по словам и парадигматические модули. Работа средства разбиения по словам зависит от конкретного языка: компонент находит границы слов в соответствии с лексическими правилами данного языка (разбиение по словам). Каждое средство разбиения по словам связано с зависящим от языка компонентом парадигматического модуля, который спрягает глаголы и добавляет флексии. Во время индексирования узел управляющей программы фильтрации использует средство разбиения по словам и парадигматический модуль для выполнения лингвистического анализа текстовых данных из указанного столбца таблицы. Язык, связанный со столбцом таблицы в полнотекстовом индексе, определяет, какое средство разбиения по словам и какой парадигматический модуль будут использоваться для индексирования столбца. Дополнительные сведения см. в разделе Настройка и управление средством разбиения на слова и парадигматические модули для поиска.

[В начало]

Обработка полнотекстового поиска

Полнотекстовый поиск работает на базе средства полнотекстового поиска. Средство полнотекстового поиска имеет две роли: поддержка индексирования и поддержка запросов.

Процесс полнотекстового индексирования

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

При индексировании данных, хранящихся в столбце типа varbinary(max) или image, фильтр, реализующий интерфейс IFilter, извлекает текст в соответствии с заданным для этих данных форматом файлов, например Microsoft Word. В некоторых случаях для работы компонентов-фильтров необходимо, чтобы данные типов varbinary(max) или image были записаны в папку filterdata, а не принудительно отправлены в память.

Одним из этапов обработки собранных текстовых данных является их анализ средством разбиения по словам, которое разделяет текст на отдельные токены, или ключевые слова. Язык, используемый при разметке, задается на уровне столбца или может быть определен компонентом-фильтром по данным типа varbinary(max), image или xml.

Для удаления стоп-слов и нормализации токенов перед их сохранением в полнотекстовом индексе или фрагменте индекса может быть проведена дополнительная обработка.

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

[В начало]

Обработка полнотекстовых запросов

Обработчик запросов передает для обработки полнотекстовые части запроса средству полнотекстового поиска. Средство полнотекстового поиска выполняет разбиение по словам и при необходимости расширения тезауруса, морфологический поиск и обработку стоп-слов (пропускаемых слов). Затем полнотекстовые части запроса представляются в форме операторов SQL, в основном как потоковые функции, возвращающие табличные значения. Во время выполнения запроса эти потоковые функции для получения правильных результатов обращаются к инвертированному индексу. Результаты возвращаются клиенту в этой точке, либо перед возвращением клиенту они подвергаются дополнительной обработке.

[В начало]

Лингвистические компоненты и поддержка языков в полнотекстовом поиске

Полнотекстовый поиск поддерживает почти 50 разных языков, в том числе английский, испанский, китайский, японский, арабский, бенгальский и хинди. Полный список поддерживаемых языков полнотекстового поиска см. в разделе sys.fulltext_languages (Transact-SQL). Каждый из столбцов в полнотекстовом индексе связан с идентификатором локали Microsoft Windows, который соответствует языку, поддерживаемому полнотекстовым поиском. Например, код языка 1033 соответствует языку «Английский (США)», а код 2057 соответствует языку «Английский (Великобритания)». Для каждого поддерживаемого языка полнотекстового поиска SQL Server предусмотрены лингвистические компоненты, которые поддерживают индексирование полнотекстовых данных и выполнение запросов к полнотекстовым данным на этом языке.

Компоненты, связанные с конкретным языком, включают следующие компоненты.

  • Средства разбиения по словам и парадигматические модули. Средство разбиения по словам находит границы слов на основании лексических правил данного языка (разбиение по словам). Каждое средство разбиения по словам связано с парадигматическим модулем, который спрягает глаголы этого языка и т. п. Дополнительные сведения см. в разделе Настройка и управление средством разбиения на слова и парадигматические модули для поиска.

  • Списки стоп-слов. Предоставляется некоторый список стоп-слов с основным набором стоп-слов (называемых также пропускаемыми словами). Стоп-слово — это слово, которое бесполезно при поиске и поэтому пропускается при выполнении полнотекстовых запросов. Примерами стоп-слов для английской локали могут служить слова «a», «and», «is» и «the». Обычно бывает нужно настроить один или несколько файлов тезауруса и списков стоп-слов. Дополнительные сведения см. в разделе Настройка и управление стоп-словами и списками стоп-слов для полнотекстового поиска.

  • Файлы тезауруса. Кроме того, SQL Server устанавливает файл тезауруса для каждого полнотекстового языка, а также файл глобального тезауруса. Устанавливаемые файлы тезауруса в основном пустые, но их можно изменять, добавляя туда определения синонимов для конкретного языка или бизнес-сценария. Подготовив тезаурус, ориентированный на пользовательские полнотекстовые данные, можно эффективно расширить область полнотекстовых запросов к этим данным. Дополнительные сведения см. в разделе Настройка и управление файлами тезауруса для полнотекстового поиска.

  • Фильтры (фильтры iFilter). Индексирование документа в столбце типов данных varbinary(max), image или xml требует наличия фильтра для выполнения дополнительной обработки. Фильтр должен соответствовать типу документа (DOC, PDF, XLS, XML и т.д.). Дополнительные сведения см. в разделе Настройка и управление фильтрами для поиска.

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

[В начало]

Связанные задачи

[В начало]

См. также

[В начало]