Выбор языка при создании полнотекстового индекса

Область применения:SQL ServerAzure SQL Database

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

Заметка

Чтобы указать язык уровня столбца для столбца полнотекстового индекса, следует при указании столбца использовать предложение LANGUAGE language_term. Дополнительные сведения см. в разделах ALTER FULLTEXT INDEX (Transact-SQL) и ALTER FULLTEXT INDEX (Transact-SQL).

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

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

Общие сведения о средствах разбиения по словам и парадигматических модулях

SQL Server 2008 (10.0.x) и более поздних версий включают полное семейство средств разбиения слов и стеммеров, которые значительно лучше, чем те, которые ранее доступны в SQL Server.

Заметка

Была реализована группа естественных языков Майкрософт (MS NLG), поддерживающая эти новые лингвистические компоненты.

Новые средства разбиения по словам дают следующие преимущества.

  • Надежность

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

  • Безопасность

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

    EXEC sp_fulltext_service 'verify_signature';  
    
  • Качество

    Средства разбиения по словам были переработаны. Тестирование показало, что они обеспечивают лучшее семантическое качество по сравнению с более ранними версиями средств разбиения по словам. Благодаря этому достигается более высокая точность повторного вызова.

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

Список языков, для которых в SQL Server были включены средства разбиения по словам и парадигматические модули, см. в разделе sys.fulltext_languages (Transact-SQL).

Использование названия языка уровня столбца в полнотекстовом поиске

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

Заметка

Код языка используется для всех типов данных, поддерживающих полнотекстовое индексирование (например, char или nchar). Если для столбца с типом char, varcharили text был задан порядок сортировки языка, отличный от языка, заданного соответствующим кодом, то во время полнотекстового индексирования и создания запросов к данным столбцам все равно будет использоваться код языка.

Разбиение по словам

Средство разбиения по словам делит индексируемый текст на лексемы по границам слов, уникальным для каждого языка. Таким образом, поведение средств разбиения для разных языков различно. Если для индексирования множества языков {x, y и z} использовать один язык (x), результат может быть непредсказуемым. Например, символы дефиса (-) или запятой (,) могут быть элементами разбиения по строкам в одном из языков, а в другом могут пропускаться. Также (достаточно редко) может проявиться непредвиденное поведение при морфологическом поиске, вызванное тем, что определенное слово может приводиться к корневой форме в разных языках разными методами. В английском языке, например, границами слов обычно являются символы пробела или знаки препинания. В других языках, например немецком, слова или символы могут объединяться. В связи с этим для уровня столбца следует выбрать такой язык, который представлял бы язык данных, хранимых в строках данного столбца.

Западные языки

Если для данных на европейских языках неизвестно, какие языки будут храниться в столбце, или если ожидается, что в нем будет храниться несколько языков, то обходным путем может послужить использование средства разбиения по словам для наиболее сложного языка из тех, что может быть в столбце. Например, допустим, что в одном столбце может встречаться содержимое на английском, испанском и немецком. В этих трех европейских языках разбиение по словам очень похоже, а наиболее сложным из языков является немецкий. Следовательно, в данном случае разумнее всего будет использовать немецкое средство разбиения по словам, которому удастся правильно обработать английский и испанский текст. Английскому средству разбиения по словам, напротив, не удалось бы правильно обработать текст на немецком языке, поскольку в нем есть составные слова.

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

Неевропейские языки

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

  • Для неродственных языков

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

  • Для двоичного содержимого (например, документов Microsoft Word)

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

  • Для содержимого в виде неформатированного текста

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

Морфология

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

Влияние типа столбца на полнотекстовый поиск

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

Средства разбиения по словам разработаны преимущественно для обработки письменного текста. Поэтому, если в тексте содержится какая-либо разметка (например, HTML), точность индексирования и поиска может оказаться невысокой. В этом случае есть два варианта. Лучше всего просто сохранить текстовые данные в столбце varbinary(max) и указать его тип документа, чтобы столбец можно было отфильтровать. Если это неприемлемо, то можно попытаться использовать нейтральное средство разбиения по словам и, если возможно, добавить элементы разметки (например, тег «br» в языке HTML) в список неучитываемых слов.

Заметка

При использовании нейтрального языка лемматизация по языковым правилам не работает.

Указание в полнотекстовом запросе языка уровня столбца, отличного от языка по умолчанию

По умолчанию в SQL Server полнотекстовый поиск выполняет синтаксический анализ условий запроса с использованием языка, указанного для каждого столбца, который включен в полнотекстовое предложение. Чтобы переопределить данное поведение, укажите во время создания запроса язык, отличный от языка по умолчанию. Чтобы задать язык (это должен быть поддерживаемый язык, для которого были установлены ресурсы), который будет использоваться при разбиении по словам, морфологическом поиске, при проверке по тезаурусу и обработке стоп-слов, можно использовать предложение LANGUAGE language_term запросов CONTAINS, CONTAINSTABLE, FREETEXTили FREETEXTTABLE .

См. также

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