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


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

Область применения: SQL Server База данных SQL Azure

При создании полнотекстового индекса необходимо указать язык уровня столбца для индексируемого столбца. Средство разбиения слов и стволовые модули указанного языка используются полнотекстовых запросов в столбце. При выборе языка столбца в процессе создания полнотекстового индекса следует учитывать несколько факторов. Эти рекомендации связаны с тем, как ваш текст токенизирован, а затем индексируется с помощью модуля Full-Text.

Примечание.

Чтобы указать язык уровня столбца для столбца полнотекстового индекса, используйте LANGUAGE <language_term> предложение при указании столбца. Дополнительные сведения см. в разделе CREATE FULLTEXT INDEX и ALTER FULLTEXT INDEX.

В этом разделе приведены общие сведения о разбиениях слов и стволовых модулях, а также описывается, как Full-Text поиск использует идентификатор кода языка (LCID) языка на уровне столбцов.

Общие сведения о разбиениях слов и стеммерах

SQL Server включает в себя полное семейство средств разбиения слов и стеммеров. Группа естественного языка (NLG) Майкрософт реализует и поддерживает эти лингвистические компоненты.

Средства разбиения слов предоставляют следующие преимущества:

  • Надежность

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

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

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

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

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

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

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

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

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

Примечание.

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

Критические слова

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

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

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

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

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

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

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

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

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

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

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

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

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

Морфология

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

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

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

Примечание.

При указании нейтрального языка на основе языка stemmming не вступают в игру.

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

По умолчанию в SQL Server Full-Text поиск анализирует термины запроса с помощью языка, указанного для каждого столбца, включенного в предложение полнотекстового текста. Чтобы переопределить данное поведение, укажите во время создания запроса язык, отличный от языка по умолчанию. Для поддерживаемых языков, ресурсы которых установлены, LANGUAGE <language_term> предложение ЗАПРОСА CONTAINS, CONTAINSTABLE, FREETEXT или FREETEXTTABLE можно использовать для указания языка, используемого для разбиения слов, стеминга, тезауруса и стоп-слов обработки терминов запроса.