Penganalisis untuk pemrosesan teks di Azure AI Search

Penganalisis adalah komponen mesin pencari teks lengkap yang bertanggung jawab untuk memproses string selama eksekusi indeks dan kueri. Pemrosesan teks (juga dikenal sebagai analisis leksikal) bersifat transformatif, yang mengubah string melalui tindakan seperti berikut:

  • Menghapus kata-kata tidak penting (stopword) dan tanda baca
  • Pisahkan frasa dan kata bertanda hubung menjadi bagian komponen
  • Kata berhuruf kecil dan berhuruf besar
  • Kurangi kata-kata menjadi bentuk akar primitif guna efisiensi penyimpanan dan agar kecocokan dapat ditemukan terlepas dari bentuk waktunya

Analisis berlaku untuk bidang Edm.String yang ditandai sebagai "dapat dicari", yang menunjukkan pencarian teks lengkap.

Untuk bidang dengan konfigurasi ini, analisis terjadi selama pengindeksan saat token dibuat, lalu sekali lagi selama eksekusi kueri saat kueri diurai dan pemindaian mesin untuk token yang cocok. Kecocokan lebih mungkin terjadi saat penganalisis yang sama digunakan untuk pengindeksan dan kueri, namun Anda dapat mengatur penganalisis untuk setiap beban kerja secara independen, bergantung pada kebutuhan Anda.

Tipe kueri yang bukan pencarian teks lengkap, seperti filter atau pencarian fuzzy, jangan melalui fase analisis di sisi kueri. Sebagai gantinya, pengurai mengirimkan string tersebut langsung ke mesin cari, menggunakan pola yang Anda berikan sebagai dasar pencocokan. Biasanya, bentuk kueri ini memerlukan token seluruh string agar pencocokan pola berfungsi. Untuk memastikan seluruh token istilah dipertahankan selama pengindeksan, Anda mungkin memerlukan penganalisis kustom. Untuk informasi selengkapnya tentang kapan dan mengapa istilah kueri dianalisis, lihat Pencarian teks lengkap di Pencarian Azure AI.

Untuk latar belakang lainnya tentang analisis leksikal, dengarkan klip video berikut untuk penjelasan singkat.

Penganalisis default

Di Azure AI Search, penganalisis secara otomatis dipanggil pada semua bidang string yang ditandai sebagai dapat dicari.

Secara default, Azure AI Search menggunakan penganalisis Standar Apache Lucene (lucene standar), yang memecah teks menjadi elemen mengikuti aturan "Segmentasi Teks Unicode" . Penganalisis standar mengonversi semua karakter ke bentuk huruf kecilnya. Dokumen terindeks dan istilah pencarian melalui analisis selama pengindeksan dan pemrosesan kueri.

Anda dapat mengganti penganalisis default berdasarkan bidang demi bidang. Penganalisis alternatif bisa berupa penganalisis bahasa untuk pemrosesan linguistik, penganalisis kustom, atau penganalisis bawaan dari daftar penganalisis yang tersedia.

Jenis penganalisis

Daftar berikut ini menjelaskan penganalisis mana yang tersedia di Azure AI Search.

Kategori Deskripsi
Penganalisis Lucene standar Default. Tidak diperlukan spesifikasi atau konfigurasi. Penganalisis tujuan umum ini berfungsi dengan baik untuk berbagai bahasa dan skenario.
Penganalisis bawaan Dikonsumsi apa adanya dan direferensikan berdasarkan nama. Ada dua jenis: bahasa dan bahasa-agnostik.

Penganalisis khusus (bahasa-agnostik) digunakan saat input teks memerlukan pemrosesan khusus atau pemrosesan minimal. Contoh penganalisis dalam kategori ini meliputi Asciifolding, Keyword, Pattern, Simple, Stop, Whitespace.

Penganalisis bahasa digunakan saat Anda membutuhkan dukungan linguistik yang kaya untuk setiap bahasa. Azure AI Search mendukung 35 penganalisis bahasa Lucene dan 50 penganalisis pemrosesan bahasa alami Microsoft.
Penganalisis kustom Adalah konfigurasi yang ditentukan pengguna dari kombinasi elemen yang ada, yang terdiri dari satu pembuat token (wajib) dan filter opsional (karakter atau token).

Beberapa penganalisis bawaan, seperti Pattern atau Stop mendukung serangkaian opsi konfigurasi terbatas. Untuk mengatur opsi ini, buat penganalisis kustom, yang terdiri dari penganalisis bawaan dan salah satu opsi alternatif yang didokumentasikan dalam Penganalisis bawaan. Seperti halnya konfigurasi kustom, berikan konfigurasi baru dengan nama, seperti myPatternAnalyzer untuk membedakannya dengan penganalisis Lucene Pattern.

Menentukan penganalisis

Mengatur penganalisis bersifat opsional. Sebagai aturan umum, coba gunakan penganalisis Lucene standar default terlebih dahulu untuk melihat performanya. Jika kueri tidak menampilkan hasil yang diharapkan, beralih ke penganalisis lainnya sering kali menjadi solusi yang tepat.

  1. Jika Anda menggunakan penganalisis kustom, tambahkan ke indeks pencarian di bawah bagian "penganalisis". Untuk informasi selengkapnya, lihat Membuat Indeks dan juga Menambahkan penganalisis kustom.

  2. Saat menentukan bidang, atur properti "penganalisis" ke salah satu hal berikut: penganalisis bawaan seperti kata kunci, penganalisis bahasa seperti en.microsoft, atau penganalisis kustom (ditentukan dalam skema indeks yang sama).

      "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": "en.microsoft",
       "indexAnalyzer": null,
       "searchAnalyzer": null
     },
    
  3. Jika Anda menggunakan penganalisis bahasa, Anda harus menggunakan properti "penganalisis" untuk menentukannya. Properti "searchAnalyzer" dan "indexAnalyzer" tidak berlaku untuk penganalisis bahasa.

  4. Sebagai alternatif, atur "indexAnalyzer" dan "searchAnalyzer" untuk memvariasikan penganalisis untuk setiap beban kerja. Properti ini bekerja sama sebagai pengganti properti "penganalisis", yang harus null. Anda mungkin menggunakan penganalisis yang berbeda untuk pengindeksan dan kueri jika salah satu aktivitas tersebut memerlukan transformasi tertentu yang tidak diperlukan oleh yang lain.

      "fields": [
     {
       "name": "ProductGroup",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": null,
       "indexAnalyzer": "keyword",
       "searchAnalyzer": "standard"
     },
    

Kapan harus menambahkan penganalisis

Waktu terbaik untuk menambahkan dan menetapkan penganalisis adalah selama pengembangan aktif, saat penghilangan dan pembuatan ulang indeks menjadi rutinitas.

Karena penganalisis digunakan untuk istilah pembuatan token, Anda harus menetapkan penganalisis saat bidang dibuat. Bahkan, menetapkan penganalisis atau indexAnalyzer ke bidang yang telah dibuat secara fisik tidak diizinkan (meskipun Anda dapat mengubah properti searchAnalyzer kapan saja tanpa dampak ke indeks).

Untuk mengubah penganalisis bidang yang ada, Anda harus menghilangkan dan membuat ulang seluruh indeks (Anda tidak dapat membangun ulang bidang individual). Untuk indeks dalam produksi, Anda dapat menunda pembuatan ulang dengan membuat bidang baru dengan tugas penganalisis baru, dan mulai menggunakannya sebagai pengganti yang lama. Gunakan Update Index untuk menggabungkan bidang baru dan mergeOrUpload untuk mengisinya. Kemudian, sebagai bagian dari layanan indeks yang direncanakan, Anda dapat membersihkan indeks untuk menghapus bidang usang.

Untuk menambahkan bidang baru ke indeks yang sudah ada, gunakan Perbarui Indeks untuk menambahkan bidang, dan mergeOrUpload untuk mengisinya.

Untuk menambahkan penganalisis kustom ke indeks yang sudah ada, abaikan bendera "allowIndexDowntime" dalam Perbarui Indeks jika Anda ingin menghindari kesalahan ini:

"Index update not allowed because it would cause downtime. In order to add new analyzers, tokenizers, token filters, or character filters to an existing index, set the 'allowIndexDowntime' query parameter to 'true' in the index update request. Note that this operation will put your index offline for at least a few seconds, causing your indexing and query requests to fail. Performance and write availability of the index can be impaired for several minutes after the index is updated, or longer for very large indexes."

Rekomendasi untuk bekerja dengan penganalisis

Bagian ini berisi saran tentang cara bekerja dengan penganalisis.

Satu penganalisis untuk baca-tulis kecuali Anda memiliki persyaratan khusus

Azure AI Search memungkinkan Anda menentukan penganalisis yang berbeda untuk pengindeksan dan pencarian melalui properti bidang "indexAnalyzer" dan "searchAnalyzer". Jika tidak ditentukan, penganalisis yang ditetapkan dengan properti penganalisis digunakan untuk pengindeksan dan pencarian. Jika penganalisis tidak ditentukan, penganalisis Lucene standar default akan digunakan.

Aturan umum adalah menggunakan penganalisis yang sama untuk pengindeksan dan pengajuan kueri, kecuali persyaratan tertentu menentukan sebaliknya. Pastikan untuk menguji secara menyeluruh. Saat pemrosesan teks berbeda pada waktu pencarian dan pengindeksan, Anda menjalankan risiko ketidakcocokan antara istilah kueri dan istilah terindeks saat konfigurasi penganalisis pencarian dan pengindeksan tidak selaras.

Pengujian selama pengembangan aktif

Penggantian penganalisis standar memerlukan pembangunan ulang indeks. Jika memungkinkan, tentukan penganalisis yang akan digunakan selama pengembangan aktif, sebelum menggulirkan indeks ke dalam produksi.

Memeriksa istilah yang ditokenisasi

Jika pencarian tidak menampilkan hasil yang diharapkan, skenario yang paling mungkin adalah perbedaan token antara input istilah pada kueri, dan istilah yang ditekonisasi dalam indeks. Jika token tidak sama, kecocokan tidak akan terwujud. Untuk memeriksa output pembuat token, sebaiknya gunakan Analyze API sebagai alat investigasi. Responsnya terdiri dari token, seperti yang dihasilkan oleh penganalisis tertentu.

Contoh REST

Contoh berikut menunjukkan definisi penganalisis untuk beberapa skenario utama.

Contoh penganalisis kustom

Contoh ini mengilustrasikan definisi penganalisis dengan opsi kustom. Opsi kustom untuk filter karakter, pembuat token, dan filter token ditentukan secara terpisah sebagai konstruksi bernama, lalu dirujuk dalam definisi penganalisis. Elemen yang ditentukan sebelumnya digunakan apa adanya dan dirujuk berdasarkan nama.

Panduan contoh ini:

  • Penganalisis adalah properti kelas bidang untuk bidang yang dapat dicari.

  • Penganalisis kustom adalah bagian dari definisi indeks. Ini mungkin sedikit disesuaikan (misalnya, menyesuaikan satu opsi dalam satu filter) atau disesuaikan di beberapa tempat.

  • Dalam hal ini, penganalisis kustomnya adalah "my_analyzer", yang pada gilirannya menggunakan pembuat token standar kustom "my_standard_tokenizer" dan dua filter token: filter huruf kecil dan asciifolding kustom "my_asciifolding".

  • Ini juga menentukan 2 filter karakter kustom "map_dash" dan "remove_whitespace". Yang pertama mengganti semua garis putus-putus dengan garis bawah sementara yang kedua menghapus semua spasi. Spasi harus berkode UTF-8 dalam aturan pemetaan. Filter karakter diterapkan sebelum tokenisasi dan akan mempengaruhi token yang dihasilkan (pembuat token standar memisahkan garis putus-putus dan spasi tetapi tidak di garis bawah).

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"my_analyzer"
        }
     ],
     "analyzers":[
        {
           "name":"my_analyzer",
           "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
           "charFilters":[
              "map_dash",
              "remove_whitespace"
           ],
           "tokenizer":"my_standard_tokenizer",
           "tokenFilters":[
              "my_asciifolding",
              "lowercase"
           ]
        }
     ],
     "charFilters":[
        {
           "name":"map_dash",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["-=>_"]
        },
        {
           "name":"remove_whitespace",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["\\u0020=>"]
        }
     ],
     "tokenizers":[
        {
           "name":"my_standard_tokenizer",
           "@odata.type":"#Microsoft.Azure.Search.StandardTokenizerV2",
           "maxTokenLength":20
        }
     ],
     "tokenFilters":[
        {
           "name":"my_asciifolding",
           "@odata.type":"#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
           "preserveOriginal":true
        }
     ]
  }

Contoh penetapan penganalisis per bidang

Penganalisis Standar adalah penganalisis default. Misalkan Anda ingin mengganti default dengan penganalisis lain yang ditentukan sebelumnya, seperti penganalisis pola. Jika Anda tidak mengatur opsi kustom, Anda hanya perlu menentukannya berdasarkan nama dalam definisi bidang.

Elemen "analyzer" menggantikan penganalisis Standar berdasarkan bidang demi bidang. Tidak ada penggantian global. Dalam contoh ini, text1 menggunakan penganalisis pola dan text2, yang tidak menentukan penganalisis, menggunakan default.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text1",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"pattern"
        },
        {
           "name":"text2",
           "type":"Edm.String",
           "searchable":true
        }
     ]
  }

Menggabungkan beberapa penganalisis untuk pengindeksan dan pencarian

API menyertakan atribut indeks untuk menentukan penganalisis yang berbeda untuk pengindeksan dan pencarian. Atribut searchAnalyzer dan indexAnalyzer harus ditentukan sebagai pasangan, menggantikan atribut penganalisis tunggal.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "indexAnalyzer":"whitespace",
           "searchAnalyzer":"simple"
        },
     ],
  }

Contoh penganalisis bahasa

Bidang yang berisi string dalam bahasa yang berbeda dapat menggunakan penganalisis bahasa, sedangkan bidang lain mempertahankan default (atau menggunakan beberapa penganalisis lain yang ditentukan sebelumnya atau kustom). Jika Anda menggunakan penganalisis bahasa, ini harus digunakan untuk operasi pengindeksan dan pencarian. Bidang yang menggunakan penganalisis bahasa tidak dapat memiliki penganalisis yang berbeda untuk pengindeksan dan pencarian.

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false
        },
        {
           "name":"text",
           "type":"Edm.String",
           "searchable":true,
           "indexAnalyzer":"whitespace",
           "searchAnalyzer":"simple"
        },
        {
           "name":"text_fr",
           "type":"Edm.String",
           "searchable":true,
           "analyzer":"fr.lucene"
        }
     ],
  }

Contoh C#

Jika menggunakan sampel kode .NET SDK, Anda dapat menambahkan contoh ini untuk menggunakan atau mengonfigurasi penganalisis.

Menambahkan penganalisis bahasa

Setiap penganalisis yang digunakan apa adanya, tanpa konfigurasi, ditentukan pada definisi bidang. Tidak ada persyaratan untuk membuat entri di bagian [penganalisis] indeks.

Penganalisis bahasa digunakan apa adanya. Untuk menggunakannya, panggil LexicalAnalyzer, menentukan jenis LexicalAnalyzerName yang menyediakan penganalisis teks yang didukung di Azure AI Search.

Penganalisis kustom juga ditentukan pada definisi bidang, tetapi agar berfungsi, Anda harus menentukan penganalisis dalam definisi indeks, seperti yang dijelaskan di bagian berikutnya.

    public partial class Hotel
    {
       . . . 
        [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.EnLucene)]
        public string Description { get; set; }

        [SearchableField(AnalyzerName = LexicalAnalyzerName.Values.FrLucene)]
        [JsonPropertyName("Description_fr")]
        public string DescriptionFr { get; set; }

        [SearchableField(AnalyzerName = "url-analyze")]
        public string Url { get; set; }
      . . .
    }

Membuat penganalisis kustom

Jika penyesuaian atau konfigurasi diperlukan, tambahkan konstruksi penganalisis ke indeks. Setelah menentukannya, Anda dapat menambahkannya ke definisi bidang seperti yang ditunjukkan dalam contoh sebelumnya.

Buat objek CustomAnalyzer. Penganalisis kustom adalah kombinasi yang ditentukan pengguna dari pembuat token yang dikenal, tanpa atau dengan filter token lainnya, dan tanpa atau dengan nama filter karakter lainnya:

Contoh berikut membuat penganalisis kustom bernama "url-analyze" yang menggunakan pembuat token uax_url_email dan Filter token huruf kecil.

private static void CreateIndex(string indexName, SearchIndexClient adminClient)
{
   FieldBuilder fieldBuilder = new FieldBuilder();
   var searchFields = fieldBuilder.Build(typeof(Hotel));

   var analyzer = new CustomAnalyzer("url-analyze", "uax_url_email")
   {
         TokenFilters = { TokenFilterName.Lowercase }
   };

   var definition = new SearchIndex(indexName, searchFields);

   definition.Analyzers.Add(analyzer);

   adminClient.CreateOrUpdateIndex(definition);
}

Langkah berikutnya

Deskripsi terperinci tentang eksekusi kueri dapat ditemukan di Pencarian teks lengkap di Pencarian Azure AI. Artikel ini menggunakan contoh untuk menjelaskan perilaku yang mungkin tampak kontra-intuitif di permukaan.

Untuk mempelajari selengkapnya tentang penganalisis, lihat artikel berikut: