Пример. Добавление синонимов для поиска ИИ Azure в C#

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

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

В этом примере вы узнаете, как:

  • Создайте карту синонимов с помощью класса SynonymMap.
  • Задайте свойство SynonymMapsName в полях, которые должны поддерживать расширение запросов с помощью синонимов.

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

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

Замечание

Синонимы можно создавать программным способом, но не на портале.

Предпосылки

Требования к учебнику:

Если вы не знакомы с клиентской библиотекой .NET, узнайте, как использовать поиск ИИ Azure в .NET.

Пример кода

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

Обзор

Запросы «до» и «после» используются для демонстрации значимости синонимов. В этом примере пример приложения выполняет запросы и возвращает результаты в примере индекса hotels, заполненного двумя документами. Во-первых, приложение выполняет поисковые запросы с помощью терминов и фраз, которые не отображаются в индексе. Во-вторых, код включает функцию синонимов, а затем перезаписывает те же запросы, на этот раз возвращая результаты на основе совпадений на карте синонимов.

Следующий код демонстрирует общий поток.

static void Main(string[] args)
{
   SearchIndexClient indexClient = CreateSearchIndexClient();

   Console.WriteLine("Cleaning up resources...\n");
   CleanupResources(indexClient);

   Console.WriteLine("Creating index...\n");
   CreateHotelsIndex(indexClient);

   SearchClient searchClient = indexClient.GetSearchClient("hotels");

   Console.WriteLine("Uploading documents...\n");
   UploadDocuments(searchClient);

   SearchClient searchClientForQueries = CreateSearchClientForQueries();

   RunQueriesWithNonExistentTermsInIndex(searchClientForQueries);

   Console.WriteLine("Adding synonyms...\n");
   UploadSynonyms(indexClient);

   Console.WriteLine("Enabling synonyms in the test index...\n");
   EnableSynonymsInHotelsIndexSafely(indexClient);
   Thread.Sleep(10000); // Wait for the changes to propagate

   RunQueriesWithNonExistentTermsInIndex(searchClientForQueries);

   Console.WriteLine("Complete.  Press any key to end application...\n");

   Console.ReadKey();
}

Запросы "До"

В RunQueriesWithNonExistentTermsInIndex выполняются поисковые запросы с терминами "пять звезд", "интернет" и "экономика AND отель".

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

Console.WriteLine("Search the entire index for the phrase \"five star\":\n");
results = searchClient.Search<Hotel>("\"five star\"", searchOptions);
WriteDocuments(results);

Console.WriteLine("Search the entire index for the term 'internet':\n");
results = searchClient.Search<Hotel>("internet", searchOptions);
WriteDocuments(results);

Console.WriteLine("Search the entire index for the terms 'economy' AND 'hotel':\n");
results = searchClient.Search<Hotel>("economy AND hotel", searchOptions);
WriteDocuments(results);

Ни один из двух индексированных документов не содержит этих терминов, поэтому мы получаем следующие выходные данные из первого RunQueriesWithNonExistentTermsInIndex: ни один документ не соответствует.

Включение синонимов

После выполнения запросов "до" пример кода включает синонимы. Включение синонимов — это двухэтапный процесс. Сначала определите и отправьте правила синонимов. Во-вторых, настройте поля для их использования. Процесс описан в UploadSynonyms и EnableSynonymsInHotelsIndex.

  1. Добавьте карту синонимов в службу поиска. В UploadSynonyms мы зададим четыре правила в карте синонимов 'desc-synonymmap' и загрузим их в службу.

    private static void UploadSynonyms(SearchIndexClient indexClient)
    {
       var synonymMap = new SynonymMap("desc-synonymmap", "hotel, motel\ninternet,wifi\nfive star=>luxury\neconomy,inexpensive=>budget");
    
       indexClient.CreateOrUpdateSynonymMap(synonymMap);
    }
    
  2. Настройте поисковые поля для использования карты синонимов в определении индекса. В AddSynonymMapsToFields мы включаем синонимы в двух полях category и tags, присваивая свойству SynonymMapNames имя недавно загруженной карты синонимов.

    private static SearchIndex AddSynonymMapsToFields(SearchIndex index)
    {
       index.Fields.First(f => f.Name == "category").SynonymMapNames.Add("desc-synonymmap");
       index.Fields.First(f => f.Name == "tags").SynonymMapNames.Add("desc-synonymmap");
       return index;
    }
    

    При добавлении карты синонимов перестроение индексов не требуется. Вы можете добавить карту синонимов в службу, а затем изменить существующие определения полей в любом индексе в любое время, чтобы использовать новую карту синонимов. Это же относится к отключению синонимов для поля. Вы можете установить свойство SynonymMapNames в пустой список.

    index.Fields.First(f => f.Name == "category").SynonymMapNames.Add("desc-synonymmap");
    

Запросы типа "After"

После отправки карты синонимов и обновления индекса для использования карты синонимов второй RunQueriesWithNonExistentTermsInIndex вызов выводит ответ:

Search the entire index for the phrase "five star":

Name: Fancy Stay        Category: Luxury        Tags: [pool, view, wifi, concierge]

Search the entire index for the term 'internet':

Name: Fancy Stay        Category: Luxury        Tags: [pool, view, wifi, concierge]

Search the entire index for the terms 'economy' AND 'hotel':

Name: Roach Motel       Category: Budget        Tags: [motel, budget]

Первый запрос находит документ из правила five star=>luxury. Второй запрос расширяет поиск, используя internet,wifi, а третий — оба hotel, motel и economy,inexpensive=>budget для поиска документов, которые соответствуют.

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

Очистите ресурсы

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