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


Нормализация текста для фильтрации без учета регистра, аспектов и сортировки

Внимание

Эта функция предоставляется в общедоступной предварительной версии, и к ней применяются дополнительные Условия использования. Предварительная версия REST API поддерживает эту функцию.

В службе "Поиск ИИ Azure" нормализатор — это компонент, который предварительно обрабатывает текст для сопоставления ключевых слов по полям, помеченным как "фильтруемый", "фасетный" или "сортируемый". В отличие от полей полнотекстового поиска, которые связаны с текстовыми анализаторами, содержимое, созданное для операций сортировки фильтров и аспектов, не проходит анализ или маркеризацию. Упущение анализа текста может привести к непредвиденным результатам при появлении различий в регистре и символах, поэтому требуется нормализатор для гомгенизации вариантов в содержимом.

Применяя нормализатор, можно добиться легкого преобразования текста, которые улучшают результаты:

  • Согласованный регистр (например, весь нижний или верхний регистр)
  • Нормализация акцентов и диакритических элементов, таких как ö или ê в эквивалентные символы ASCII "o" и "e"
  • Сопоставление символов, таких как - и пробелы, в указанный пользователем символ

Преимущества нормализаторов

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

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

  • $filter=City eq 'Las Vegas' возвращает только документы, содержащие точный текст "Las Vegas" и исключающие документы "LAS VEGAS" и "las vegas"неадекватные, если для использования требуется все документы независимо от регистра.

  • search=*&facet=City,count:5 возвращается "Las Vegas"и "LAS VEGAS" "las vegas" как отдельные значения, несмотря на то, что тот же город.

  • search=usa&$orderby=Cityвозвращает города в лексографическом порядке: "Las Vegas", "Seattle""las vegas", даже если намерение состоит в том, чтобы упорядочить те же города вместе независимо от случая.

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

Указание нормализатора

Нормализаторы указываются в определении индекса на основе каждого поля в текстовых полях (Edm.String и Collection(Edm.String)), которые имеют по крайней мере одно из свойств, допускающих фильтрацию, "сортируемые" или "аспектируемые", для которых задано значение true. Установка нормализатора является необязательным и имеет значение NULL по умолчанию. Перед настройкой настраиваемого нормализатора рекомендуется оценить предопределенные нормализаторы.

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

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

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "filterable": true,
       "analyzer": "en.microsoft",
       "normalizer": "lowercase"
       ...
     }
    ]
    
  2. Пользовательские нормализаторы определяются в разделе "нормализаторы" индекса сначала, а затем назначены определению поля, как показано на предыдущем шаге. Дополнительные сведения см. в статьях Создание индекса и Добавление пользовательских нормализаторов.

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": null,
       "normalizer": "my_custom_normalizer"
     },
    

Примечание.

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

Хорошим решением для производственных индексов, где перестроение индексов обходится дорого, является создание нового поля, идентичного старому, но с новым нормализатором, и использование его вместо старого. Для внедрения нового поля используется запрос Update Index, а запрос mergeOrUpload позволяет заполнить его. Позже в рамках планового обслуживания индекса можно очистить его, чтобы удалить устаревшие поля.

Стандартные и пользовательские нормализаторы

Поиск ИИ Azure предоставляет встроенные нормализаторы для распространенных вариантов использования, а также возможности настройки по мере необходимости.

Категория Description
Предопределенные нормализаторы Предоставляются в готовом виде и могут использоваться без какой-либо настройки.
Пользовательские нормализаторы 1 Для сложных сценариев. Требуется определяемая пользователем конфигурация сочетания существующих элементов, состоящая из фильтров символов и маркеров.

(1) Пользовательские нормализаторы не указывают маркеры, так как нормализаторы всегда создают один маркер.

Справочник по нормализаторам

Предопределенные нормализаторы

Имя Описание и параметры
standard Текст в нижнем регистре, за которым следует asciifolding.
строчные буквы Преобразует символы в нижний регистр.
uppercase Преобразует символы в верхний регистр.
asciifolding Преобразует символы, которые не в блоке Basic Latin Юникода, преобразуются в эквивалент ASCII, если он существует. Например, изменение à aна .
elision Удаляет пропуск в начале токенов.

Поддерживаемые фильтры знаков

Нормализаторы поддерживают два фильтра символов, идентичные их аналогам в пользовательских фильтрах символов анализатора:

Поддерживаемые фильтры токенов

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

Добавление пользовательских нормализаторов

Пользовательские нормализаторы определяются в схеме индекса. Определение содержит имя, тип, один или несколько фильтров символов и фильтров маркеров. Фильтры символов и фильтры маркеров — это стандартные блоки для настраиваемого нормализатора и ответственные за обработку текста. Эти фильтры применяются слева направо.

Это token_filter_name_1 имя фильтра маркеров и char_filter_name_1 char_filter_name_2 имена фильтров char (см . поддерживаемые фильтры маркеров и поддерживаемые таблицы фильтров символовниже для допустимых значений).

"normalizers":(optional)[
   {
      "name":"name of normalizer",
      "@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
      "charFilters":[
         "char_filter_name_1",
         "char_filter_name_2"
      ],
      "tokenFilters":[
         "token_filter_name_1"
      ]
   }
],
"charFilters":(optional)[
   {
      "name":"char_filter_name_1",
      "@odata.type":"#char_filter_type",
      "option1": "value1",
      "option2": "value2",
      ...
   }
],
"tokenFilters":(optional)[
   {
      "name":"token_filter_name_1",
      "@odata.type":"#token_filter_type",
      "option1": "value1",
      "option2": "value2",
      ...
   }
]

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

Пример пользовательского нормализатора

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

  • Настраиваемый нормализатор с именем "my_custom_normalizer" определен в разделе "нормализаторы" определения индекса.

  • Нормализатор состоит из двух фильтров символов и трех фильтров маркеров: elision, нижнего регистра и настраиваемого фильтра asciifolding "my_asciifolding".

  • Первый фильтр символов "map_dash" заменяет все дефисы символами подчеркивания, а второй — "remove_whitespace" удаляет все пробелы.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false,
        },
        {
           "name":"city",
           "type":"Edm.String",
           "filterable": true,
           "facetable": true,
           "normalizer": "my_custom_normalizer"
        }
     ],
     "normalizers":[
        {
           "name":"my_custom_normalizer",
           "@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
           "charFilters":[
              "map_dash",
              "remove_whitespace"
           ],
           "tokenFilters":[              
              "my_asciifolding",
              "elision",
              "lowercase",
           ]
        }
     ],
     "charFilters":[
        {
           "name":"map_dash",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["-=>_"]
        },
        {
           "name":"remove_whitespace",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["\\u0020=>"]
        }
     ],
     "tokenFilters":[
        {
           "name":"my_asciifolding",
           "@odata.type":"#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
           "preserveOriginal":true
        }
     ]
  }

См. также