Contoh: Menambahkan sinonim untuk Pencarian Azure AI di C#

Sinonim memperluas kueri dengan mencocokkan istilah yang dianggap setara secara semantik dengan istilah input. Misalnya, Anda mungkin ingin "mobil" mencocokkan dokumen yang berisi istilah "otomobil" atau "kendaraan".

Di Azure AI Search, sinonim didefinisikan dalam peta sinonim, melalui aturan pemetaan yang mengaitkan istilah yang setara. Contoh ini mencakup langkah-langkah penting untuk menambahkan dan menggunakan sinonim dengan indeks yang ada.

Dalam contoh ini, pelajari cara:

Anda bisa melakukan kueri pada bidang dengan sinonim yang diaktifkan seperti biasanya. Tidak ada sintaks kueri tambahan yang diperlukan untuk mengakses sinonim.

Anda dapat membuat beberapa peta sinonim, mempostingnya sebagai sumber daya di seluruh layanan yang tersedia untuk indeks apa pun, lalu mereferensikan mana yang akan digunakan di tingkat bidang. Pada saat permintaan, selain mencari dalam indeks, Azure AI Search melakukan pencarian di peta sinonim jika peta tersebut ditentukan pada bidang yang digunakan dalam permintaan.

Nota

Sinonim dapat dibuat secara terprogram, tetapi tidak di portal.

Prasyarat

Persyaratan tutorial meliputi:

Jika Anda tidak terbiasa dengan pustaka klien .NET, lihat Cara menggunakan Azure AI Search di .NET.

Contoh kode

Anda dapat menemukan kode sumber lengkap aplikasi sampel yang digunakan dalam contoh ini di GitHub.

Gambaran Umum

Kueri sebelum dan sesudah digunakan untuk menunjukkan nilai sinonim. Dalam contoh ini, aplikasi sampel menjalankan kueri dan mengembalikan hasil pada contoh indeks "hotel" yang diisi dengan dua dokumen. Pertama, aplikasi menjalankan kueri pencarian menggunakan istilah dan frasa yang tidak muncul dalam indeks. Kedua, kode mengaktifkan fitur sinonim, lalu menerbitkan ulang kueri yang sama, kali ini mengembalikan hasil berdasarkan kecocokan di peta sinonim.

Kode berikut menunjukkan alur keseluruhan.

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

Kueri "Sebelumnya"

Dalam RunQueriesWithNonExistentTermsInIndex, terbitkan kueri pencarian dengan "bintang lima", "internet", dan "ekonomi DAN hotel".

Kueri frasa, seperti "bintang lima", harus diapit dalam tanda kutip, dan mungkin juga memerlukan karakter escape tergantung pada klien Anda.

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

Tidak satu pun dari dua dokumen terindeks berisi istilah, jadi kita mendapatkan output berikut dari yang pertama RunQueriesWithNonExistentTermsInIndex: tidak ada dokumen yang cocok.

Aktifkan sinonim

Setelah kueri "sebelum" dijalankan, kode sampel mengaktifkan sinonim. Mengaktifkan sinonim adalah proses dua langkah. Pertama, tentukan dan unggah aturan sinonim. Kedua, konfigurasikan bidang untuk menggunakannya. Proses ini diuraikan dalam UploadSynonyms dan EnableSynonymsInHotelsIndex.

  1. Tambahkan peta sinonim ke layanan pencarian Anda. Dalam UploadSynonyms, kami mendefinisikan empat aturan dalam peta sinonim kami 'desc-synonymmap' dan mengunggah ke layanan.

    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. Konfigurasikan bidang yang dapat dicari untuk menggunakan peta sinonim dalam definisi indeks. Dalam AddSynonymMapsToFields, kami mengaktifkan sinonim pada dua kolom category dan tags dengan mengatur properti SynonymMapNames ke nama peta sinonim yang baru diunggah.

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

    Saat Anda menambahkan peta sinonim, pembangunan ulang indeks tidak diperlukan. Anda dapat menambahkan peta sinonim ke layanan Anda, lalu mengubah definisi bidang yang ada dalam indeks apa pun, kapan saja, untuk menggunakan peta sinonim baru. Hal yang sama berlaku dalam menonaktifkan sinonim untuk bidang. Anda dapat mengatur properti SynonymMapNames ke daftar kosong.

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

Kueri "Setelah"

Setelah peta sinonim diunggah dan indeks diperbarui untuk menggunakan peta sinonim, panggilan kedua RunQueriesWithNonExistentTermsInIndex menghasilkan respons:

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]

Kueri pertama menemukan dokumen dari aturan five star=>luxury. Kueri kedua memperluas pencarian menggunakan internet,wifi dan yang ketiga menggunakan kedua hotel, motel dan economy,inexpensive=>budget dalam menemukan dokumen yang cocok.

Menambahkan sinonim benar-benar mengubah pengalaman pencarian. Dalam contoh ini, kueri asli gagal mengembalikan hasil yang bermakna meskipun dokumen dalam indeks kami relevan. Dengan mengaktifkan sinonim, kita dapat memperluas indeks untuk menyertakan istilah yang umum digunakan, tanpa perubahan pada data yang mendasar dalam indeks.

Membersihkan sumber daya

Cara tercepat untuk membersihkan setelah contoh adalah dengan menghapus grup sumber daya yang berisi layanan Azure AI Search. Anda dapat menghapus grup sumber daya sekarang untuk menghapus semua yang ada di dalamnya secara permanen. Di portal, nama grup sumber daya ada di halaman Gambaran Umum layanan Pencarian Azure AI.