Настройка и управление файлами тезауруса для полнотекстового поиска

Применимо к:SQL Server

Запросы полнотекстового поиска SQL Server могут искать синонимы заданных пользователем терминов с помощью тезауруса полнотекстового поиска. Каждый тезаурус определяет набор синонимов для указанного языка. Подготовив тезаурус, ориентированный на пользовательские полнотекстовые данные, можно эффективно расширить область полнотекстовых запросов к этим данным.

Сопоставление с тезаурусом выполняется для всех запросов FREETEXT и FREETEXTABLE и для любых запросов CONTAINS и CONTAINSTABLE, которые указывают предложение FORMSOF THESAURUS.

Тезаурус полнотекстового поиска представлен в виде текстового XML-файла.

Что такое тезаурус

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

  • Расширяющий набор

    Расширяющий набор содержит группу синонимов, таких как «писатель», «автор» и «журналист», которые заменяют друг друга в полнотекстовом поиске. Запросы, содержащие слова, которые совпадают с одним из синонимов в расширяющем наборе, расширяются таким образом, чтобы включать в себя все другие синонимы в этом расширяющем наборе.

    Дополнительные сведения см. в подразделе XML-структура расширяющего набора далее в этом разделе.

  • Заменяющий набор

    Заменяющий набор содержит текстовый шаблон, заменяемый подстановочным набором. Пример см. в подразделе XML-структура заменяющего набора далее в этом разделе.

  • Настройка диакритических знаков

    Для заданного тезауруса все шаблоны поиска могут учитывать или не учитывать диакритические знаки, такие как тильда (~), акут () или умляут (¨). Такие шаблоны соответственно называются шаблонами с учетом диакритических знаков или шаблонами без учета диакритических знаков. Например, предположим, что в запросе полнотекстового поиска необходимо заменить шаблон «café» другими шаблонами. Если тезаурус не учитывает диакритические знаки, то полнотекстовый поиск замещает шаблоны «café» и «cafe». Если файл тезауруса учитывает диакритические знаки, то полнотекстовый поиск замещает только шаблон «café». По умолчанию тезаурус не учитывает диакритические знаки.

Файлы тезауруса по умолчанию

SQL Server предоставляет набор XML-файлов тезауруса, по одному для каждого поддерживаемого языка. Эти файлы в основном пустые. Они содержат только структуру XML верхнего уровня, которая распространена для всех тезаурусов SQL Server и закомментированного примера тезауруса.

Расположение файлов тезауруса

Местоположение файлов тезауруса по умолчанию:

<SQL_Server_data_files_path>\MSSQL13.MSSQLSERVER\MSSQL\FTDATA\

В местоположении по умолчанию содержатся следующие файлы.

  • Зависящие от языка файлы тезауруса.

    При установке в указанном выше месте устанавливаются пустые файлы тезауруса. Для каждого поддерживаемого языка предоставляется отдельный файл. Системный администратор может настроить эти файлы.

    Имена файлов по умолчанию для файлов тезауруса имеют следующий формат:

    'ts' + <three-letter language-abbreviation> + '.xml'

    Для данного языка имя файла тезауруса указывается в следующем параметре реестра:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<instance-name>\MSSearch\<language-abbrev>

  • Файл глобального тезауруса.

    Пустой файл глобального тезауруса, tsGlobal.xml.

Изменение расположения файла тезауруса

Можно менять местонахождение и имена файлов тезауруса, изменяя соответствующий раздел реестра. Для каждого языка местонахождение файла тезауруса указывается в следующем параметре реестра:

HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance name>\MSSearch\Language\<language-abbreviation>\TsaurusFile

Файл глобального тезауруса соответствует языку «Нейтральный» с кодом языка (LCID) 0. Это значение может быть изменено только администратором.

Как полнотекстовые запросы используют тезаурус

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

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

Структура файла тезауруса

Каждый файл тезауруса определяет XML-контейнер, идентификатор которого — Microsoft Search Thesaurus, и комментарий, <!-- ... -->, который содержит образец тезауруса. Тезаурус определен в элементе <thesaurus>, содержащем образцы дочерних элементов, которые определяют настройку диакритических знаков, расширяющие наборы и заменяющие наборы.

Типичный пустой файл тезауруса содержит следующий XML-текст:

<XML ID="Microsoft Search Thesaurus">  
  
<!--  Commented out  
  
    <thesaurus xmlns="x-schema:tsSchema.xml">  
<diacritics_sensitive>0</diacritics_sensitive>  
        <expansion>  
            <sub>Internet Explorer</sub>  
            <sub>IE</sub>  
            <sub>IE5</sub>  
        </expansion>  
        <replacement>  
            <pat>NT5</pat>  
            <pat>W2K</pat>  
            <sub>Windows 2012</sub>  
        </replacement>  
        <expansion>  
            <sub>run</sub>  
            <sub>jog</sub>  
        </expansion>  
    </thesaurus>  
-->  
</XML>  

XML-структура набора расширения

Каждый расширяющий набор заключен в элемент <expansion>. Внутри этого элемента можно указать одну или несколько подстановок в элементе <sub>. В расширяющем наборе можно указать группу подстановок, являющихся синонимами.

Например, можно изменить раздел расширения так, чтобы подстановки «писатель», «автор» и «журналист» считались синонимами. Полнотекстовые запросы, содержащие слова, совпадающие с одним из подстановочных слов, расширяются таким образом, чтобы включать в себя другие подстановочные слова в этом расширяющем наборе. Следовательно, в предыдущем примере при выполнении запроса FORMS OF THESAURUS или FREETEXT со словом «автор» после полнотекстового поиска будут также возвращены результаты, содержащие слова «писатель» и «журналист».

Для этого примера раздел расширяющего набора должен выглядеть следующим образом:

<expansion>  
        <sub>writer</sub>  
        <sub>author</sub>  
        <sub>journalist</sub>  
</expansion>  

XML-структура замены набора

Каждый заменяющий набор заключен в элемент <replacement>. Внутри этого элемента можно указать один или несколько шаблонов в элементе <pat> и ноль или более подстановок в элементах <sub>, по одному для синонима. Можно указать шаблон, заменяемый подстановочным набором. Шаблоны и подстановки могут содержать одно слово или последовательность слов. Если для шаблона не указано подстановки, то шаблон удаляется из запроса пользователя.

Например, допустим, что необходимо заменить слово-шаблон «Win8» словами «Windows Server 2012» или «Windows 8.0». При выполнении полнотекстового запроса со словом «Win8» полнотекстовый поиск возвращает только результаты, содержащие слова «Windows Server 2012» или «Windows 8.0». Результаты, содержащие слово «Win8», не возвращаются. Это происходит потому, что шаблон «Win8» был заменен шаблонами «Windows Server 2012» и «Windows 8.0».

Для этого примера раздел заменяющего набора должен выглядеть следующим образом:

<replacement>  
        <pat>Win8</pat>  
        <sub>Windows Server 2012</sub>  
        <sub>Windows 8.0</sub>  
</replacement>  

Если имеются два заменяющих набора с одинаковыми сравниваемыми шаблонами, приоритет имеет самый длинный из них. Например, если определены следующие заменяющие наборы, при выполнении запроса FORMS OF THESAURUS по фразе «сообщество Internet Explorer в сети», набор «Internet Explorer» имеет приоритет перед набором «Internet». Следовательно, запрос будет обрабатываться так, как будто он сформирован по фразам «сообщество IE в сети» или «сообщество IE 9 в сети».

<replacement>  
         <pat>Internet</pat>  
         <sub>intranet</sub>  
</replacement>  

и

<replacement>  
         <pat>Internet Explorer</pat>  
         <sub>IE</sub>  
         <sub>IE 9</sub>  
</replacement>  

XML-структура настройки диакритических знаков

Настройка диакритических знаков определяется в отдельном элементе <diacritics_sensitive>. Этот элемент содержит целое значение, которое управляет поведением диакритических знаков, как показано ниже.

Настройка диакритических знаков значение XML
Без учета диакритических знаков 0 <diacritics_sensitive>0</diacritics_sensitive>
Учет диакритических знаков 1 <diacritics_sensitive>1</diacritics_sensitive>

Заметка

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

Изменение файла тезауруса

Тезаурус для данного языка можно настроить путем изменения соответствующего файла тезауруса (XML-файла). Во время установки устанавливаются пустые тезаурусовые файлы, содержащие только <xml> контейнер и закомментированные образец <thesaurus> элемента. Чтобы полнотекстовые поисковые запросы, которые правильно искали синонимы, необходимо создать фактический <thesaurus> элемент, определяющий набор синонимов. Могут быть определены две формы синонимов — расширяющие наборы и заменяющие наборы.

Изменение файла тезауруса

  1. Откройте этот файл в Блокноте или в другом текстовом редакторе.

  2. При первом редактировании файла тезауруса удалите следующие строки комментариев, находящиеся, соответственно, в конце и в начале файла:

    <!--Commented out  
    -->  
    
  3. Добавьте, измените или удалите заменяющий или расширяющий набор.

  4. Сохраните файл и закройте Блокнот.

  5. Используйте хранимую процедуру sp_fulltext_load_thesaurus_file , чтобы загрузить содержимое файла тезауруса в базу данных tempdb, указав идентификатор языкового стандарта (LCID), соответствующий языку файла тезауруса. Например, файлу тезауруса английского языка, tsenu.xml, соответствует код языка 1033.

    USE AdventureWorks;  
    EXEC sys.sp_fulltext_load_thesaurus_file 1033;  
    GO
    

Рекомендации для изменения файлов тезауруса

Рекомендуется, чтобы элементы в файле тезауруса не содержали специальных символов. Это объясняется особенностями поведения средств разбиения по словам в отношении специальных символов. Если элемент тезауруса содержит какие-нибудь специальные символы, то средства разбиения по словам, использованные в сочетании с этим элементом, могут оказать малозаметное воздействие на поведение полнотекстового запроса.

Рекомендуется, чтобы элементы <sub> не содержали стоп-слов, так как стоп-слова удаляются из полнотекстового индекса. Запросы расширяются, чтобы охватить элементы <sub> из файла тезауруса, и если элемент <sub> содержит стоп-слова, то размер запроса излишне увеличивается.

Ограничения для изменения файлов тезауруса

На изменения файла тезауруса налагаются следующие ограничения.

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

  • При изменении файлов тезауруса с помощью текстовых редакторов эти файлы необходимо сохранять в Юникоде с указанием отметок порядка байтов.

  • Элементы тезауруса не могут быть пустыми или делиться на пустые строки.

  • Фразы в файле тезауруса не могут иметь длину более 512 символов.

  • Тезаурус не должен содержать повторяющихся элементов среди элементов <sub> расширяющих наборов и элементов <pat> заменяющих наборов.

См. также

CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
sp_fulltext_load_thesaurus_file (Transact-SQL)
sys.dm_fts_parser (Transact-SQL)