Exempel: Lägga till synonymer för Azure AI Search i C#

Med synonymer kan du utöka en fråga genom att matcha mot termer som anses betyda samma sak som den angivna söktermen. Du kanske vill att söktermen ”bil” även ska matcha dokument som innehåller termen ”fordon”.

I Azure AI Search definieras synonymer i en synonymkarta genom mappningsregler som associerar motsvarande termer. I det här exemplet beskrivs viktiga steg för att lägga till och använda synonymer med ett befintligt index.

I det här exemplet får du lära dig att:

  • Skapa en synonymkarta med hjälp av klassen SynonymMap.
  • Ange egenskapen Synonym Kartor Name på fält som ska stödja frågeexpansion via synonymer.

Du kan köra frågor mot ett synonymaktiverat fält på samma sätt som normalt. Det krävs ingen ytterligare frågesyntax för att komma åt synonymer.

Du kan skapa flera synonymmappningar, publicera dem som en resurs på tjänstnivå tillgänglig för alla index och sedan referera till den mappning som ska användas på fältnivå. Vid frågetillfället, förutom att söka i ett index, gör Azure AI Search en sökning i en synonymkarta, om en anges för fält som används i frågan.

Kommentar

Synonymer kan skapas programmatiskt, men inte i portalen.

Förutsättningar

I den här självstudien behöver du följande:

Om du inte känner till .NET-klientbiblioteket kan du läsa Så här använder du Azure AI Search i .NET.

Exempelkod

Du hittar den fullständiga källkoden för exempelprogrammet som används i det här exemplet på GitHub.

Översikt

Före-och-efter-frågor används för att demonstrera värdet för synonymer. I det här exemplet kör ett exempelprogram frågor och returnerar resultat på ett exempelindex med "hotell" ifyllt med två dokument. Först kör programmet sökfrågor med termer och fraser som inte visas i indexet. För det andra aktiverar koden synonymfunktionen och utfärdar sedan samma frågor igen. Den här gången returneras resultat baserat på matchningar i synonymkartan.

I koden nedan kan du se flödet som en helhet.

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();
}

”Före”-frågor

Kör sökningar med termerna ”five star”, ”internet” och ”economy AND hotel” i RunQueriesWithNonExistentTermsInIndex.

Frasfrågor, till exempel "femstjärniga", måste omges av citattecken och kan också behöva escape-tecken beroende på klienten.

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);

Inget av de två indexerade dokumenten innehåller termerna, så vi får följande utdata från det första RunQueriesWithNonExistentTermsInIndex: inget dokument matchade.

Aktivera synonymer

När "före"-frågorna har körts aktiverar exempelkoden synonymer. Att aktivera synonymer är en tvåstegsprocess. Definiera och ladda först upp synonymregler. För det andra konfigurerar du fält för att använda dem. Processen beskrivs i UploadSynonyms och EnableSynonymsInHotelsIndex.

  1. Lägg till en synonymmappning i söktjänsten. I UploadSynonyms definierar vi fyra regler i synonymmappningen desc-synonymmap och laddar upp mappningen till tjänsten.

    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. Konfigurera sökbara fält så att synonymmappningen används i indexdefinitionen. I AddSynonymMapsToFields aktiverar vi synonymer för de två fälten category och tags genom att ange namnet på synonymmappningen för egenskapen 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;
    }
    

    När du lägger till en synonymmappning behöver du inte skapa indexet på nytt. Du kan lägga till en synonymmappning för tjänsten och sedan göra tillägg till befintliga fältdefinitioner i dina index så att den nya synonymmappningen används. Indexet tillgänglighet påverkas inte om du lägger till nya attribut. Samma sak gäller om du inaktiverar synonymer för ett fält. Du kan helt enkelt ange en tom lista för egenskapen SynonymMapNames.

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

”Efter”-frågor

När synonymmappningen har laddats upp och indexet har uppdaterats så att mappningen används ger det andra anropet av RunQueriesWithNonExistentTermsInIndex följande resultat:

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]

Den första frågan hittar dokument via regeln five star=>luxury. Den andra frågan utökar sökningen med internet,wifi och den tredje med både hotel, motel och economy,inexpensive=>budget, och därför hittas de matchande dokumenten.

Du får en helt ny sökupplevelse när du lägger till synonymer. I det här exemplet kunde de ursprungliga frågorna inte returnera meningsfulla resultat trots att dokumenten i vårt index var relevanta. Genom att aktivera synonymer kan vi expandera ett index med termer som används ofta utan att behöva ändra underliggande data i indexet.

Rensa resurser

Det snabbaste sättet att rensa efter ett exempel är genom att ta bort resursgruppen som innehåller Azure AI-tjänsten Search. Du kan ta bort resursgruppen nu så att allt innehåll i den tas bort permanent. I portalen finns resursgruppens namn på sidan Översikt för Azure AI tjänsten Search.

Nästa steg

Det här exemplet demonstrerade synonymfunktionen i C#-kod för att skapa och publicera mappningsregler och anropa sedan synonymkartan för en fråga. Mer information finns i referensdokumentationen för .NET SDK och REST-API:t.