Компонент Full-text SearchFull-Text Search

Полнотекстовый поиск в SQL ServerSQL Server и База данных SQL AzureAzure SQL Database позволяет пользователям и приложениям выполнять полнотекстовые запросы к символьным данным в таблицах SQL ServerSQL Server .Full-Text Search in SQL ServerSQL Server and База данных SQL AzureAzure SQL Database lets users and applications run full-text queries against character-based data in SQL ServerSQL Server tables.

Основные задачиBasic tasks

В этой статье представлен обзор функции полнотекстового поиска и описываются ее компоненты и архитектура.This topic provides an overview of Full-Text Search and describes its components and its architecture. Если вы хотите немедленно приступить к работе, здесь вы найдете простые примеры задач.If you prefer to get started right away, here are the basic tasks.

Примечание

Full-Text Search is an optional component of the SQL ServerSQL Server .Full-Text Search is an optional component of the SQL ServerSQL Server Database Engine. Если при установке SQL Server полнотекстовый поиск не был выбран, запустите программу установки SQL Server повторно, чтобы добавить его.If you didn't select Full-Text Search when you installed SQL Server, run SQL Server Setup again to add it.

ОбзорOverview

В полнотекстовый индекс включается один или несколько символьных столбцов таблицы.A full-text index includes one or more character-based columns in a table. Эти столбцы могут содержать любой из следующих типов данных: char, varchar, nchar, nvarchar, text, ntext, image, xmlили varbinary(max) и FILESTREAM.These columns can have any of the following data types: char, varchar, nchar, nvarchar, text, ntext, image, xml, or varbinary(max) and FILESTREAM. Каждый полнотекстовый индекс индексирует один или несколько столбцов таблицы, а каждому столбцу может соответствовать определенный язык.Each full-text index indexes one or more columns from the table, and each column can use a specific language.

Полнотекстовые запросы выполняют лингвистический поиск в текстовых данных в полнотекстовых индексах путем обработки слов и фраз в соответствии с правилами конкретного языка, например английского или японского.Full-text queries perform linguistic searches against text data in full-text indexes by operating on words and phrases based on the rules of a particular language such as English or Japanese. Полнотекстовые запросы могут включать простые слова и фразы или несколько форм слова или фразы.Full-text queries can include simple words and phrases or multiple forms of a word or phrase. Полнотекстовый запрос возвращает все документы, которые содержат как минимум одно совпадение (известное также как попадание).A full-text query returns any documents that contain at least one match (also known as a hit). Совпадение возникает в том случае, когда целевой документ содержит все термины, указанные в полнотекстовом запросе, и соответствует всем остальным условиям поиска, например расстояние между совпадающими терминами.A match occurs when a target document contains all the terms specified in the full-text query, and meets any other search conditions, such as the distance between the matching terms.

Запросы полнотекстового поиска Full-Text Search queries

После добавления столбцов в полнотекстовый индекс, приложения и пользователи смогут выполнять полнотекстовые запросы к тексту из столбцов.After columns have been added to a full-text index, users and applications can run full-text queries on the text in the columns. Эти запросы могут вести поиск любых приведенных ниже элементов.These queries can search for any of the following:

  • Одно или несколько конкретных слов или фраз (простое выражение)One or more specific words or phrases (simple term)

  • Слова, начинающиеся заданным текстом, или фразы с такими словами (префиксные выражения)A word or a phrase where the words begin with specified text (prefix term)

  • Словоформы конкретного слова (производное выражение)Inflectional forms of a specific word (generation term)

  • Слова или фразы, находящиеся рядом с другими словами или фразами (выражения с учетом расположения)A word or phrase close to another word or phrase (proximity term)

  • Синонимические формы конкретного слова (тезаурус)Synonymous forms of a specific word (thesaurus)

  • Слова или фразы со взвешенными значениями (взвешенное выражение)Words or phrases using weighted values (weighted term)

    В полнотекстовых запросах не учитывается регистр букв.Full-text queries are not case-sensitive. Например, поиск значения «Алюминий» или «алюминий» вернет одинаковые результаты.For example, searching for "Aluminum" or "aluminum" returns the same results.

    Все полнотекстовые запросы используют небольшой набор предикатов Transact-SQLTransact-SQL (CONTAINS и FREETEXT) и функций (CONTAINSTABLE и FREETEXTTABLE).Full-text queries use a small set of Transact-SQLTransact-SQL predicates (CONTAINS and FREETEXT) and functions (CONTAINSTABLE and FREETEXTTABLE). Однако точная структура полнотекстовых запросов определяется целями поиска данного бизнес-сценария.However, the search goals of a given business scenario influence the structure of the full-text queries. Например:For example:

  • Электронный бизнес — поиск продукта на веб-сайте:e-business—searching for a product on a website:

    SELECT product_id   
    FROM products   
    WHERE CONTAINS(product_description, ”Snap Happy 100EZ” OR FORMSOF(THESAURUS,’Snap Happy’) OR ‘100EZ’)   
    AND product_cost < 200 ;  
    
  • Сценарий комплектования штата — поиск кандидатов, имеющих опыт работы с SQL ServerSQL Server:Recruitment scenario—searching for job candidates that have experience working with SQL ServerSQL Server:

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

    Дополнительные сведения см. в разделе Запросы с полнотекстовым поиском.For more information, see Query with Full-Text Search.

Сравнение предиката LIKE и запросов полнотекстового поиска Compare Full-Text Search queries to the LIKE predicate

В отличие от полнотекстового поиска предикат LIKE Transact-SQLTransact-SQL работает только с комбинациями символов.In contrast to full-text search, the LIKE Transact-SQLTransact-SQL predicate works on character patterns only. Кроме того, предикат LIKE нельзя использовать в запросах к форматированным двоичным данным.Also, you cannot use the LIKE predicate to query formatted binary data. Более того, запрос с предикатом LIKE к большому количеству неструктурированных текстовых данных выполняется гораздо медленнее, чем эквивалентный полнотекстовый запрос к тем же данным.Furthermore, a LIKE query against a large amount of unstructured text data is much slower than an equivalent full-text query against the same data. Выполнение запроса LIKE к нескольким миллионам строк текстовых данных может занять несколько минут, в то время как полнотекстовый запрос к тем же данным занимает всего несколько секунд или даже меньше, в зависимости от количества возвращаемых строк.A LIKE query against millions of rows of text data can take minutes to return; whereas a full-text query can take only seconds or less against the same data, depending on the number of rows that are returned.

Архитектура полнотекстового поиска Full-Text Search architecture

Архитектура полнотекстового поиска состоит из следующих процессов.Full-text search architecture consists of the following processes:

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

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

    По соображениям безопасности фильтры загружаются отдельными процессами, которые называются узлами управляющей программы фильтрации.For security reasons, filters are loaded by separate processes called the filter daemon hosts. Процессы fdhost.exe создаются службой запуска FDHOST (MSSQLFDLauncher) и выполняются под учетными данными безопасности учетной записи службы запуска FDHOST.The fdhost.exe processes are created by an FDHOST launcher service (MSSQLFDLauncher), and they run under the security credentials of the FDHOST launcher service account. Следовательно, чтобы работало полнотекстовое индексирование и выполнялись полнотекстовые запросы, должна быть запущена служба FDHOST.Therefore, the FDHOST launcher service must be running for full-text indexing and full-text querying to work. Сведения о настройке учетной записи службы для этой службы см. в разделе Настройка учетной записи службы средства запуска управляющей программы полнотекстовой фильтрации.For information about setting the service account for this service, see Set the Service Account for the Full-text Filter Daemon Launcher.

    Эти два процесса содержат компоненты архитектуры полнотекстового поиска.These two processes contain the components of the full-text search architecture. Эти компоненты и их связи приведены на следующей иллюстрации.These components and their relationships are summarized in the following illustration. Описание компонентов приведено после иллюстрации.The components are described after the illustration.

    Архитектура полнотекстового поискаfull-text search architecture

Процесс SQL Server SQL Server process

В полнотекстовом поиске используются следующие компоненты процесса SQL ServerSQL Server .The SQL ServerSQL Server process uses the following components for full-text search:

  • Пользовательские таблицы.User tables. В этих таблицах содержатся данные, по которым осуществляется полнотекстовое индексирование.These tables contain the data to be full-text indexed.

  • Средство сбора полнотекстовых данных.Full-text gatherer. Средство сбора полнотекстовых данных работает с потоками полнотекстового сканирования.The full-text gatherer works with the full-text crawl threads. Оно отвечает за планирование заполнения полнотекстовых индексов и управление им, а также за наблюдение за полнотекстовыми каталогами.It is responsible for scheduling and driving the population of full-text indexes, and also for monitoring full-text catalogs.

  • Файлы тезауруса.Thesaurus files. Эти файлы содержат синонимы искомых терминов.These files contain synonyms of search terms. Дополнительные сведения см. в разделе Настройка файлов тезауруса для полнотекстового поиска и управление ими.For more information, see Configure and Manage Thesaurus Files for Full-Text Search.

  • Объекты списка стоп-слов.Stoplist objects. Объекты списка стоп-слов содержат список часто встречающихся слов, бесполезных при поиске.Stoplist objects contain a list of common words that are not useful for the search. Дополнительные сведения см. в разделе Настройка стоп-слов и списков стоп-слов для полнотекстового поиска и управление ими.For more information, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

  • SQL ServerSQL Server обработчик запросов. SQL ServerSQL Server query processor. Обработчик запросов компилирует и выполняет SQL-запросы.The query processor compiles and executes SQL queries. Если SQL-запрос включает запрос полнотекстового поиска, то запрос направляется в средство полнотекстового поиска как в процессе компиляции, так и при выполнении.If a SQL query includes a full-text search query, the query is sent to the Full-Text Engine, both during compilation and during execution. Результат запроса сопоставляется с полнотекстовым индексом.The query result is matched against the full-text index.

  • Средство полнотекстового поиска.Full-Text Engine. Средство полнотекстового поиска в SQL ServerSQL Server полностью интегрировано с обработчиком запросов.The Full-Text Engine in SQL ServerSQL Server is fully integrated with the query processor. Средство полнотекстового поиска компилирует и выполняет полнотекстовые запросы.The Full-Text Engine compiles and executes full-text queries. Как часть выполнения запроса средство полнотекстового поиска может получать входные данные из тезауруса и списка стоп-слов.As part of query execution, the Full-Text Engine might receive input from the thesaurus and stoplist.

    Примечание

    В SQL Server 2008SQL Server 2008 и более поздних версиях средство полнотекстового поиска находится в процессе SQL ServerSQL Server , а не в отдельной службе.In SQL Server 2008SQL Server 2008 and later versions, the Full-Text Engine resides in the SQL ServerSQL Server process, rather than in a separate service. Интеграция средства полнотекстового поиска в ядро СУБД повышает возможности работы с текстом, оптимизацию смешанных запросов и общую производительность.Integrating the Full-Text Engine into the Database Engine improved full-text manageability, optimization of mixed query, and overall performance.

  • Модуль записи индекса (индексатор).Index writer (indexer). Модуль записи индекса строит структуру, используемую для хранения индексированных токенов.The index writer builds the structure that is used to store the indexed tokens.

  • Диспетчер управляющей программы фильтрации.Filter daemon manager. Диспетчер управляющей программы фильтрации отвечает за наблюдение за состоянием узла управляющей программы фильтрации для полнотекстового поиска.The filter daemon manager is responsible for monitoring the status of the Full-Text Engine filter daemon host.

Filter Daemon Host process Filter Daemon Host process

Узел управляющей программы фильтрации представляет собой процесс, запускаемый средством полнотекстового поиска.The filter daemon host is a process that is started by the Full-Text Engine. Он запускает следующие компоненты полнотекстового поиска, которые отвечают за доступ, фильтрацию и разбиение по словам данных из таблиц, а также разбиение по словам и морфологический поиск во входных данных запроса.It runs the following full-text search components, which are responsible for accessing, filtering, and word breaking data from tables, as well as for word breaking and stemming the query input.

Существуют следующие компоненты узла управляющей программы фильтрации.The components of the filter daemon host are as follows:

  • Обработчик протокола.Protocol handler. Этот компонент запрашивает данные из памяти для дальнейшей обработки и обращается к данным из пользовательской таблицы в указанной базе данных.This component pulls the data from memory for further processing and accesses data from a user table in a specified database. Одной из его задач является сбор данных из столбцов с полнотекстовой индексацией и передача этих данных в узел управляющей программы фильтрации, в котором требуемым образом применяется фильтрация и средство разбиения по словам.One of its responsibilities is to gather data from the columns being full-text indexed and pass it to the filter daemon host, which will apply filtering and word breaker as required.

  • Фильтры.Filters. Для некоторых типов данных требуется фильтрация перед полнотекстовой индексацией данных в документе, в том числе для данных в столбцах varbinary, varbinary(max), imageили xml .Some data types require filtering before the data in a document can be full-text indexed, including data in varbinary, varbinary(max), image, or xml columns. Фильтр, используемый для данного документа, зависит от типа этого документа.The filter used for a given document depends on its document type. Например, для документов Microsoft Word (DOC), Microsoft Excel (XLS) и XML-документов (XML) используются разные фильтры.For example, different filters are used for Microsoft Word (.doc) documents, Microsoft Excel (.xls) documents, and XML (.xml) documents. Затем фильтр выделяет из документа фрагменты данных, при этом удаляется внедренное форматирование, остается текст и, возможно, сведения о положении текста.Then the filter extracts chunks of text from the document, removing embedded formatting and retaining the text and, potentially, information about the position of the text. Результатом является поток текстовых данных.The result is a stream of textual information. Дополнительные сведения см. в разделе Настройка фильтров для поиска и управление ими.For more information, see Configure and Manage Filters for Search.

  • Средства разбиения по словам и парадигматические модули.Word breakers and stemmers. Работа средства разбиения по словам зависит от конкретного языка: компонент находит границы слов в соответствии с лексическими правилами данного языка (разбиение по словам).A word breaker is a language-specific component that finds word boundaries based on the lexical rules of a given language (word breaking). Каждое средство разбиения по словам связано с зависящим от языка компонентом парадигматического модуля, который спрягает глаголы и добавляет флексии.Each word breaker is associated with a language-specific stemmer component that conjugates verbs and performs inflectional expansions. Во время индексирования узел управляющей программы фильтрации использует средство разбиения по словам и парадигматический модуль для выполнения лингвистического анализа текстовых данных из указанного столбца таблицы.At indexing time, the filter daemon host uses a word breaker and stemmer to perform linguistic analysis on the textual data from a given table column. Язык, связанный со столбцом таблицы в полнотекстовом индексе, определяет, какое средство разбиения по словам и какой парадигматический модуль будут использоваться для индексирования столбца.The language that is associated with a table column in the full-text index determines which word breaker and stemmer are used for indexing the column. Дополнительные сведения о парадигматических модулях см. в разделе Настройка средств разбиения на слова и парадигматические модули для поиска и управление ими.For more information, see Configure and Manage Word Breakers and Stemmers for Search.

Обработка полнотекстового поиска Full-Text Search processing

Полнотекстовый поиск работает на базе средства полнотекстового поиска.Full-text search is powered by the Full-Text Engine. Средство полнотекстового поиска имеет две роли: поддержка индексирования и поддержка запросов.The Full-Text Engine has two roles: indexing support and querying support.

Процесс полнотекстового индексирования Full-Text indexing process

При инициации заполнения полнотекстового индекса (который также называют «сканированием») средство полнотекстового поиска помещает большие пакеты данных в память и оповещает управляющую программу полнотекстовой фильтрации.When a full-text population (also known as a crawl) is initiated, the Full-Text Engine pushes large batches of data into memory and notifies the filter daemon host. Управляющая программа выполняет фильтрацию и разбиение по словам, а также преобразует конвертированные данные в инвертированный список слов.The host filters and word breaks the data and converts the converted data into inverted word lists. Затем средство полнотекстового поиска запрашивает конвертированные данные из списка слов, удаляет стоп-слова и сохраняет списки слов в виде пакета в один или несколько инвертированных индексов.The full-text search then pulls the converted data from the word lists, processes the data to remove stopwords, and persists the word lists for a batch into one or more inverted indexes.

При индексировании данных, хранящихся в столбце типа varbinary(max) или image , фильтр, реализующий интерфейс IFilter , извлекает текст в соответствии с заданным для этих данных форматом файлов, например MicrosoftMicrosoft Word.When indexing data stored in a varbinary(max) or image column, the filter, which implements the IFilter interface, extracts text based on the specified file format for that data (for example, MicrosoftMicrosoft Word). В некоторых случаях для работы компонентов-фильтров необходимо, чтобы данные типов varbinary(max)или image были записаны в папку filterdata, а не принудительно отправлены в память.In some cases, the filter components require the varbinary(max), or image data to be written out to the filterdata folder, instead of being pushed into memory.

Одним из этапов обработки собранных текстовых данных является их анализ средством разбиения по словам, которое разделяет текст на отдельные токены, или ключевые слова.As part of processing, the gathered text data is passed through a word breaker to separate the text into individual tokens, or keywords. Язык, используемый при разметке, задается на уровне столбца или может быть определен компонентом-фильтром по данным типа varbinary(max), imageили xml .The language used for tokenization is specified at the column level, or can be identified within varbinary(max), image, or xml data by the filter component.

Для удаления стоп-слов и нормализации токенов перед их сохранением в полнотекстовом индексе или фрагменте индекса может быть проведена дополнительная обработка.Additional processing may be performed to remove stopwords, and to normalize tokens before they are stored in the full-text index or an index fragment.

После завершения операции заполнения инициируется заключительный процесс слияния фрагментов индекса в один главный полнотекстовый индекс.When a population has completed, a final merge process is triggered that merges the index fragments together into one master full-text index. Это повышает производительность запросов за счет использования одного главного индекса вместо нескольких фрагментов индексов и позволяет использовать более точные количественные оценки для ранжирования данных по релевантности.This results in improved query performance since only the master index needs to be queried rather than a number of index fragments, and better scoring statistics may be used for relevance ranking.

Обработка полнотекстовых запросов Full-Text querying process

Обработчик запросов передает для обработки полнотекстовые части запроса средству полнотекстового поиска.The query processor passes the full-text portions of a query to the Full-Text Engine for processing. Средство полнотекстового поиска выполняет разбиение по словам и при необходимости расширения тезауруса, морфологический поиск и обработку стоп-слов (пропускаемых слов).The Full-Text Engine performs word breaking and, optionally, thesaurus expansions, stemming, and stopword (noise-word) processing. Затем полнотекстовые части запроса представляются в форме операторов SQL, в основном как потоковые функции, возвращающие табличные значения.Then the full-text portions of the query are represented in the form of SQL operators, primarily as streaming table-valued functions (STVFs). Во время выполнения запроса эти потоковые функции для получения правильных результатов обращаются к инвертированному индексу.During query execution, these STVFs access the inverted index to retrieve the correct results. Результаты возвращаются клиенту в этой точке, либо перед возвращением клиенту они подвергаются дополнительной обработке.The results are either returned to the client at this point, or they are further processed before being returned to the client.

Архитектура полнотекстового индексаFull-text index architecture

Данные полнотекстовых индексов используются средством полнотекстового поиска для компиляции полнотекстовых запросов, способных быстро находить таблицу с теми или иными словами или словосочетаниями.The information in full-text indexes is used by the Full-Text Engine to compile full-text queries that can quickly search a table for particular words or combinations of words. В полнотекстовом индексе хранятся данные о значимых для поиска словах и их расположении в одном или нескольких столбцах таблицы базы данных.A full-text index stores information about significant words and their location within one or more columns of a database table. Полнотекстовый индекс — это специальный тип функционального индекса на основе токенов, создаваемый и используемый средством полнотекстового поиска для SQL ServerSQL Server.A full-text index is a special type of token-based functional index that is built and maintained by the Full-Text Engine for SQL ServerSQL Server. Процесс создания полнотекстового индекса отличается от создания индексов других типов.The process of building a full-text index differs from building other types of indexes. Вместо создания сбалансированного дерева на основе значения, хранящегося в конкретной строке, служба полнотекстового поиска создает инвертированную стековую сжатую структуру индекса на основе отдельных токенов индексируемого текста.Instead of constructing a B-tree structure based on a value stored in a particular row, the Full-Text Engine builds an inverted, stacked, compressed index structure based on individual tokens from the text being indexed. Размер полнотекстового индекса ограничен только доступными ресурсами памяти компьютера, на котором запущен экземпляр SQL ServerSQL Server .The size of a full-text index is limited only by the available memory resources of the computer on which the instance of SQL ServerSQL Server is running.

Начиная с SQL Server 2008SQL Server 2008полнотекстовые индексы встроены в ядро СУБД, а не размещены в файловой системе, как в предыдущих версиях SQL ServerSQL Server.Beginning in SQL Server 2008SQL Server 2008, the full-text indexes are integrated with the Database Engine, instead of residing in the file system as in previous versions of SQL ServerSQL Server. В новой базе данных полнотекстовый каталог является виртуальным объектом, не принадлежащим ни к одной файловой группе. Он является лишь логическим понятием, связанным с группой полнотекстовых индексов.For a new database, the full-text catalog is now a virtual object that does not belong to any filegroup; it is merely a logical concept that refers to a group of the full-text indexes. Однако обратите внимание, что при обновлении базы данных SQL Server 2005SQL Server 2005 (любого полнотекстового каталога с файлами данных) создается новая файловая группа. Дополнительные сведения см. в разделе Обновление полнотекстового поиска.Note, however, that during upgrade of a SQL Server 2005SQL Server 2005 database, any full-text catalog that contains data files, a new filegroup is created; for more information, see Upgrade Full-Text Search.

На одну таблицу может приходиться только один полнотекстовый индекс.Only one full-text index is allowed per table. Чтобы в таблице можно было создать полнотекстовый индекс, она должна содержать один уникальный столбец, значением которого не является NULL.For a full-text index to be created on a table, the table must have a single, unique nonnull column. Можно создать полнотекстовый индекс на столбцах типа char, varchar, nchar, nvarchar, text, ntext, image, xmlи varbinary, а также для полнотекстового поиска может индексироваться varbinary(max) .You can build a full-text index on columns of type char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary, and varbinary(max) can be indexed for full-text search. Для создания полнотекстового индекса на столбце, тип данных которого varbinary, varbinary(max), imageили xml , необходимо указать столбец типов.Creating a full-text index on a column whose data type is varbinary, varbinary(max), image, or xml requires that you specify a type column. Столбец типов — это столбец таблицы, в каждой строке которого хранятся расширения файлов (DOC, PDF, XLS и т. д.) документа.A type column is a table column in which you store the file extension (.doc, .pdf, .xls, and so forth) of the document in each row.

Структура полнотекстового индекса Full-text index structure

Чтобы понять, как работает средство полнотекстового поиска, необходимо разобраться в структуре полнотекстового индекса.A good understanding of the structure of a full-text index will help you understand how the Full-Text Engine works. В данном разделе в качестве примера таблицы используется следующий фрагмент таблицы Document в Adventure WorksAdventure Works .This topic uses the following excerpt of the Document table in Adventure WorksAdventure Works as an example table. В данном фрагменте показываются только два столбца: DocumentID и Title , а также три строки из таблицы.This excerpt shows only two columns, the DocumentID column and the Title column, and three rows from the table.

В этом примере подразумевается, что полнотекстовый индекс был создан по столбцу Title .For this example, we will assume that a full-text index has been created on the Title column.

DocumentIDDocumentID TitleTitle
11 Crank Arm and Tire MaintenanceCrank Arm and Tire Maintenance
22 Front Reflector Bracket and Reflector Assembly 3Front Reflector Bracket and Reflector Assembly 3
33 Front Reflector Bracket InstallationFront Reflector Bracket Installation

Например, в следующей таблице, в которой приведен фрагмент 1, показано содержимое полнотекстового индекса, созданного по столбцу Title таблицы Document .For example, the following table, which shows Fragment 1, depicts the contents of the full-text index created on the Title column of the Document table. Полнотекстовые индексы содержат больше данных, чем представлено в этой таблице.Full-text indexes contain more information than is presented in this table. Таблица является логическим представлением полнотекстового индекса, она предоставляется только с целью демонстрации.The table is a logical representation of a full-text index and is provided for demonstration purposes only. Строки хранятся в сжатом формате для оптимизации использования диска.The rows are stored in a compressed format to optimize disk usage.

Обратите внимание, что данные были инвертированы по сравнению с оригинальными документами.Notice that the data has been inverted from the original documents. Инверсия происходит, поскольку ключевые слова сопоставлены с идентификаторами документов.Inversion occurs because the keywords are mapped to the document IDs. По этой причине полнотекстовый индекс часто называют инвертированным индексом.For this reason, a full-text index is often referred to as an inverted index.

Обратите также внимание, что ключевое слово «and» было удалено из полнотекстового индекса.Also notice that the keyword "and" has been removed from the full-text index. Это было сделано, поскольку «and» является стоп-словом. Удаление стоп-слов из полнотекстового индекса может привести к значительной экономии дискового пространства, тем самым увеличивая производительность запросов.This is done because "and" is a stopword, and removing stopwords from a full-text index can lead to substantial savings in disk space thereby improving query performance. Дополнительные сведения о стоп-словах см. в разделе Настройка и управление стоп-словами и списками стоп-слов для полнотекстового поиска.For more information about stopwords, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

Фрагмент 1Fragment 1

Ключевое словоKeyword ColIdColId DocIdDocId НаличиеOccurrence
CrankCrank 11 11 11
ArmArm 11 11 22
TireTire 11 11 44
ОбслуживаниеMaintenance 11 11 55
FrontFront 11 22 11
FrontFront 11 33 11
ReflectorReflector 11 22 22
ReflectorReflector 11 22 55
ReflectorReflector 11 33 22
BracketBracket 11 22 33
BracketBracket 11 33 33
СборкаAssembly 11 22 66
33 11 22 77
УстановкаInstallation 11 33 44

Столбец Keyword содержит представление одного токена, извлеченного при индексировании.The Keyword column contains a representation of a single token extracted at indexing time. Токены определяются средствами разбиения по словам.Word breakers determine what makes up a token.

Столбец ColId содержит значение, соответствующее столбцу, по которому выполняется полнотекстовое индексирование.The ColId column contains a value that corresponds to a particular column that is full-text indexed.

Столбец DocId содержит значения восьмибайтового целого числа, соответствующего определенному значению полнотекстового ключа в определенной таблице, в которой выполняется полнотекстовое индексирование.The DocId column contains values for an eight-byte integer that maps to a particular full-text key value in a full-text indexed table. Данное поведение необходимо, если полнотекстовый ключ имеет тип данных, отличный от целого.This mapping is necessary when the full-text key is not an integer data type. В таких случаях сопоставления между значениями полнотекстового ключа и значениями DocId обеспечиваются в отдельной таблице, называемой таблицей сопоставления DocId.In such cases, mappings between full-text key values and DocId values are maintained in a separate table called the DocId Mapping table. Для создания запросов к этим сопоставлениям следует использовать системную хранимую процедуру sp_fulltext_keymappings .To query for these mappings use the sp_fulltext_keymappings system stored procedure. Для удовлетворения условия поиска необходимо соединить значения DocId из приведенной выше таблицы с таблицей сопоставления DocId. Это позволит возвращать строки из запрашиваемой базовой таблицы.To satisfy a search condition, DocId values from the above table need to be joined with the DocId Mapping table to retrieve rows from the base table being queried. Если значение полнотекстового ключа из базовой таблицы имеет целочисленный тип, то само значение служит в качестве значения DocId и дополнительного сопоставления не требуется.If the full-text key value of the base table is an integer type, the value directly serves as the DocId and no mapping is necessary. Следовательно, использование целочисленных значений полнотекстового ключа может оптимизировать выполнение полнотекстовых запросов.Therefore, using integer full-text key values can help optimize full-text queries.

Столбец Occurrence содержит целочисленное значение.The Occurrence column contains an integer value. Каждому значению DocId соответствует список значений частотности, которые соответствуют относительным смещениям слов для определенного ключевого слова в документе с этим значением DocId.For each DocId value, there is a list of occurrence values that correspond to the relative word offsets of the particular keyword within that DocId. С помощью значений частотности удобно определять фразовое или близкое совпадение; например, для фраз значения частотности находятся рядом.Occurrence values are useful in determining phrase or proximity matches, for example, phrases have numerically adjacent occurrence values. Кроме того, их удобно использовать при вычислении коэффициента релевантности. Например, они дают возможность подсчитать частоту употребления ключевого слова в документе DocId.They are also useful in computing relevance scores; for example, the number of occurrences of a keyword in a DocId may be used in scoring.

Фрагменты полнотекстового индекса Full-text index fragments

Логический полнотекстовый индекс обычно разбивается по нескольким внутренним таблицам.The logical full-text index is usually split across multiple internal tables. Каждая из внутренних таблиц называется фрагментом полнотекстового индекса.Each internal table is called a full-text index fragment. Некоторые из данных фрагментов могут содержать более свежие данные.Some of these fragments might contain newer data than others. Например, если пользователь обновляет следующую строку с DocId, равным 3, а в таблице выполняется автоматическое отслеживание изменений, то будет создан новый фрагмент.For example, if a user updates the following row whose DocId is 3 and the table is auto change-tracked, a new fragment is created.

DocumentIDDocumentID TitleTitle
33 Rear ReflectorRear Reflector

В следующем примере, в котором показан фрагмент 2, содержатся более новые данные о DocId 3, чем во фрагменте 1.In the following example, which shows Fragment 2, the fragment contains newer data about DocId 3 compared to Fragment 1. Следовательно, если пользователь запрашивает «задний отражатель», то для DocId 3 будут использованы данные из фрагмента 2.Therefore, when the user queries for "Rear Reflector" the data from Fragment 2 is used for DocId 3. Каждый из фрагментов имеет отметку времени создания, которую можно использовать в запросах с помощью представления каталога sys.fulltext_index_fragments .Each fragment is marked with a creation timestamp that can be queried by using the sys.fulltext_index_fragments catalog view.

Фрагмент 2Fragment 2

Ключевое словоKeyword ColIdColId DocIdDocId OccOcc
RearRear 11 33 11
ReflectorReflector 11 33 22

Как можно увидеть во фрагменте 2, полнотекстовым запросам необходимо осуществить внутреннее обращение к каждому фрагменту. Более старые записи не учитываются.As can be seen from Fragment 2, full-text queries need to query each fragment internally and discard older entries. Следовательно, наличие слишком большого количества полнотекстовых фрагментов индекса в полнотекстовом индексе может привести к существенному уменьшению производительности запросов.Therefore, too many full-text index fragments in the full-text index can lead to substantial degradation in query performance. Для уменьшения количества фрагментов выполните переорганизацию полнотекстового каталога, используя параметр REORGANIZE инструкции ALTER FULLTEXT CATALOG Transact-SQLTransact-SQL .To reduce the number of fragments, reorganize the fulltext catalog by using the REORGANIZE option of the ALTER FULLTEXT CATALOG Transact-SQLTransact-SQL statement. Данная инструкция выполняет слияние в единый файл, объединяя все фрагменты в единый большой фрагмент, и удаляет все устаревшие записи из полнотекстового индекса.This statement performs a master merge, which merges the fragments into a single larger fragment and removes all obsolete entries from the full-text index.

После выполнения реорганизации в образце индекса будут содержаться следующие строки.After being reorganized, the example index would contain the following rows:

Ключевое словоKeyword ColIdColId DocIdDocId OccOcc
CrankCrank 11 11 11
ArmArm 11 11 22
TireTire 11 11 44
ОбслуживаниеMaintenance 11 11 55
FrontFront 11 22 11
RearRear 11 33 11
ReflectorReflector 11 22 22
ReflectorReflector 11 22 55
ReflectorReflector 11 33 22
BracketBracket 11 22 33
СборкаAssembly 11 22 66
33 11 22 77

Различия между полнотекстовыми индексами и обычными индексами SQL Server:Differences between full-text indexes and regular SQL Server indexes:.

Полнотекстовые индексыFull-text indexes Обычные индексы SQL ServerRegular SQL Server indexes
Для одной таблицы разрешен только один полнотекстовой индекс.Only one full-text index allowed per table. Для одной таблицы разрешено несколько обычных индексов.Several regular indexes allowed per table.
Добавление данных к полнотекстовым индексам (заполнение) может быть запрошено явно, выполняться по расписанию либо автоматически при добавлении новых данных в базу.The addition of data to full-text indexes, called a population, can be requested through either a schedule or a specific request, or can occur automatically with the addition of new data. Обновляются автоматически при создании, вставке, обновлении или удалении данных, на которых они созданы.Updated automatically when the data upon which they are based is inserted, updated, or deleted.
Группируются в той же базе данных в один или несколько полнотекстовых каталогов.Grouped within the same database into one or more full-text catalogs. Не группируются.Not grouped.

Лингвистические компоненты и поддержка языков в полнотекстовом поиске Full-Text search linguistic components and language support

Полнотекстовый поиск поддерживает почти 50 разных языков, в том числе английский, испанский, китайский, японский, арабский, бенгальский и хинди.Full-text search supports almost 50 diverse languages, such as English, Spanish, Chinese, Japanese, Arabic, Bengali, and Hindi. Полный список поддерживаемых языков полнотекстового поиска см. в разделе sys.fulltext_languages (Transact-SQL).For a complete list of the supported full-text languages, see sys.fulltext_languages (Transact-SQL). Каждый из столбцов в полнотекстовом индексе связан с идентификатором локали Microsoft Windows, который соответствует языку, поддерживаемому полнотекстовым поиском.Each of the columns contained in the full-text index is associated with a Microsoft Windows locale identifier (LCID) that equates to a language that is supported by full-text search. Например, код языка 1033 соответствует языку «Английский (США)», а код 2057 соответствует языку «Английский (Великобритания)».For example, LCID 1033 equates to U.S English, and LCID 2057 equates to British English. Для каждого поддерживаемого языка полнотекстового поиска SQL ServerSQL Server предусмотрены лингвистические компоненты, которые поддерживают индексирование полнотекстовых данных и выполнение запросов к полнотекстовым данным на этом языке.For each supported full-text language, SQL ServerSQL Server provides linguistic components that support indexing and querying full-text data that is stored in that language.

Компоненты, связанные с конкретным языком, включают следующие компоненты.Language-specific components include the following:

  • Средства разбиения по словам и парадигматические модули.Word breakers and stemmers. Средство разбиения по словам находит границы слов на основании лексических правил данного языка (разбиение по словам).A word breaker finds word boundaries based on the lexical rules of a given language (word breaking). Каждое средство разбиения по словам связано с парадигматическим модулем, который спрягает глаголы этого языка и т. п.Each word breaker is associated with a stemmer that conjugates verbs for the same language. Дополнительные сведения о парадигматических модулях см. в разделе Настройка средств разбиения на слова и парадигматические модули для поиска и управление ими.For more information, see Configure and Manage Word Breakers and Stemmers for Search.

  • Списки стоп-слов.Stoplists. Предоставляется список стоп-слов с основным набором стоп-слов (называемых также пропускаемыми словами).A system stoplist is provided that contains a basic set stopwords (also known as noise words). Стоп-словом является слово, которое бесполезно при поиске и пропускается при выполнении полнотекстовых запросов.A stopword is a word that does not help the search and is ignored by full-text queries. Примерами стоп-слов для английской локали могут служить слова «a», «and», «is» и «the».For example, for the English locale words such as "a", "and", "is", and "the" are considered stopwords. Обычно бывает нужно настроить один или несколько файлов тезауруса и списков стоп-слов.Typically, you will need to configure one or more thesaurus files and stoplists. Дополнительные сведения см. в разделе Настройка стоп-слов и списков стоп-слов для полнотекстового поиска и управление ими.For more information, see Configure and Manage Stopwords and Stoplists for Full-Text Search.

  • Файлы тезауруса.Thesaurus files. SQL ServerSQL Server устанавливает файл тезауруса для каждого полнотекстового языка, а также файл глобального тезауруса. also installs a thesaurus file for each full-text language, as well as a global thesaurus file. Устанавливаемые файлы тезауруса в основном пустые, но их можно изменять, добавляя туда определения синонимов для конкретного языка или бизнес-сценария.The installed thesaurus files are essentially empty, but you can edit them to define synonyms for a specific language or business scenario. Подготовив тезаурус, ориентированный на пользовательские полнотекстовые данные, можно эффективно расширить область полнотекстовых запросов к этим данным.By developing a thesaurus tailored to your full-text data, you can effectively broaden the scope of full-text queries on that data. Дополнительные сведения см. в разделе Настройка файлов тезауруса для полнотекстового поиска и управление ими.For more information, see Configure and Manage Thesaurus Files for Full-Text Search.

  • Фильтры (iFilters).Filters (iFilters). Индексирование документа в столбце типа данных varbinary(max), imageили xml требует наличия фильтра для выполнения дополнительной обработки.Indexing a document in a varbinary(max), image, or xml data type column requires a filter to perform extra processing. Фильтр должен соответствовать типу документа (DOC, PDF, XLS, XML и т.д.).The filter must be specific to the document type (.doc, .pdf, .xls, .xml, and so forth). Дополнительные сведения см. в разделе Настройка фильтров для поиска и управление ими.For more information, see Configure and Manage Filters for Search.

    Средства разбиения по словам (и парадигматические модули), а также фильтры выполняются в процессе управляющей программы фильтрации (fdhost.exe).Word breakers (and stemmers) and filters run in the filter daemon host process (fdhost.exe).

ОБЛАСТЬ ПРИМЕНЕНИЯ ЭТОЙ СТАТЬИ:даSQL Server (начиная с 2008)даБаза данных SQL AzureнетХранилище данных SQL AzureнетParallel Data WarehouseTHIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse