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

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

При создании полнотекстового индекса укажите язык на уровне столбца для индексируемого столбца. Полнотекстовые запросы в столбце используют словопрерыватели и стеммеры указанного языка. Подумайте, как движок Full-Text токенизирует и индексирует ваш текст при выборе языка столбцов.

Примечание.

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

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

Введение в разделители слов и стеммеры

Ядро СУБД SQL Server включает средства разбиения слов и стеммеры для многих языков, включенные по умолчанию. Группа естественного языка (NLG) Майкрософт реализует и поддерживает эти лингвистические компоненты. Список поддерживаемых языков см. sys.fulltext_languages.

Внешние компоненты, такие как средства разбиения слов и фильтры, должны быть подписаны для повышения безопасности. Чтобы проверить подпись, выполните следующую команду:

EXECUTE sp_fulltext_service 'verify_signature';

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

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

Примечание.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Стемминг

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

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

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

Примечание.

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

Укажите нестандартный язык на уровне столбцов в полнотекстовом запросе

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