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

Примечание

Поиск с использованием ИИ Azure доступна через портал Azure, REST API и Azure SDKs. Он также лежит в основе Foundry IQ — управляемого слоя знаний, который преобразует корпоративный контент в многократно используемые базы знаний с учетом разрешений доступа для агентов на портале Microsoft Foundry.

В Поиск с использованием ИИ 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"
     },
    

Примечание

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

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

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

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

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

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

Тестирование нормализатора

Анализатор тестирования (REST) можно использовать, чтобы узнать, как нормализатор обрабатывает входные данные.

Запрос

  POST https://[search service name].search.windows.net/indexes/[index name]/analyze?api-version=[api-version]
    Content-Type: application/json
    api-key: [admin key]

  {
     "normalizer":"asciifolding",
     "text": "Vis-à-vis means Opposite"
  }

Ответ

HTTP/1.1 200 OK

{
  "tokens": [
    {
      "token": "Vis-a-vis means Opposite",
      "startOffset": 0,
      "endOffset": 24,
      "position": 0
    }
  ]
}

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

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

Имя Описание и параметры
Стандартный Переводит текст в нижний регистр и выполняет преобразование в ASCII.
строчные буквы Преобразует символы в нижний регистр.
Прописные Преобразует символы в верхний регистр.
асцифолдинг (преобразование в ASCII) Преобразует символы, которые находятся вне базового латинского блока Unicode, в их эквиваленты в ASCII, если они существуют. Например, изменение à на a.
elision Удаляет элизии с начала токенов.

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

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

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

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

Добавление настраиваемых нормализаторов

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

Это token_filter_name_1 имя фильтра маркеров и char_filter_name_1char_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" определен в разделе "нормализаторы" определения индекса.

  • Нормализатор состоит из двух фильтров символов и трех фильтров токенов: элизия, фильтр нижнего регистра и настраиваемый фильтр аскифолдинга "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
        }
     ]
  }

См. также