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

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

ПримечаниеПримечание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Морфологический поиск

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

Влияние метода хранения данных на полнотекстовый поиск

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

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

ПримечаниеПримечание

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

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

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

Поддержка языков

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

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

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

ПримечаниеПримечание

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

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

  • Надежность

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

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

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

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

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

  • Охват

    В комплекте с SQL Server 2008 поставляются включенные по умолчанию средства разбиения по словам для большого количества языков.

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

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

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

После загрузки сторонних средств разбиения по словам следует обновить список поддерживаемых полнотекстовых языков. Для этого запустите системную хранимую процедуру sp_fulltext_service с параметром update_languages:

EXEC sp_fulltext_service 'update_languages';

После этого языки добавленных средств разбиения по словам будут перечислены в представлении каталога sys.fulltext_languages.

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

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

ПримечаниеПримечание

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