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

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

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

Примечание.

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

В этом разделе дается введение в средства разбиения слов и стемминга, а также рассматривается, как полнотекстовый поиск использует идентификатор кода языка (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, полнотекстовый поиск использует ближайшее доступное имя языка из того же языкового семейства, если таковое имеется. В противном случае полнотекстовый поиск использует нейтральное средство разбиения слов. Данное поведение может повлиять на точность повторного вызова. В связи с этим при создании полнотекстового индекса рекомендуется указывать допустимое и доступное название языка для каждого столбца.

Примечание.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Стемминг

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

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

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

Примечание.

Если указан нейтральный язык, стемминг с учётом языка не применяется.

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

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