Penganalisis untuk pemrosesan teks di Azure Cognitive 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:

  • Hapus kata-kata yang 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.

Jenis kueri yang bukan pencarian teks lengkap, seperti filter atau pencarian fuzzy, tidak 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 selama pengindeksan, Anda mungkin memerlukan penganalisis kustom. Untuk informasi selengkapnya tentang kapan dan mengapa istilah kueri dianalisis, lihat Pencarian teks lengkap di Azure Cognitive Search.

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

Penganalisis default

Dalam kueri Azure Cognitive Search, penganalisis otomatis dipanggil di semua bidang string yang ditandai sebagai dapat dicari.

Secara default, Azure Cognitive Search menggunakan penganalisis Apache Lucene Standard (lucene standar), yang membagi teks menjadi elemen yang mengikuti aturan "Unicode Text Segmentation". Selain itu, 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 yang tersedia di Azure Cognitive 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 jika Anda membutuhkan dukungan linguistik yang kaya untuk setiap bahasa. Azure Cognitive 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.

Cara 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. Saat membuat definisi bidang dalam indeks, atur properti "analyzer" ke salah satu dari 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
     },
    

    Jika menggunakan penganalisis bahasa, Anda harus menggunakan properti "analyzer" untuk menentukannya. Properti "searchAnalyzer" dan "indexAnalyzer" tidak berlaku untuk penganalisis bahasa.

  2. Sebagai alternatif, atur "indexAnalyzer" dan "searchAnalyzer" untuk memvariasikan penganalisis untuk setiap beban kerja. Properti ini diatur bersama-sama dan menggantikan properti "analyzer", 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"
     },
    
  3. Hanya untuk penganalisis kustom, buat entri di bagian [penganalisis] indeks, lalu tetapkan penganalisis kustom Anda ke definisi bidang per salah satu dari dua langkah sebelumnya. Untuk informasi selengkapnya, lihat Membuat Indeks dan juga Menambahkan penganalisis kustom.

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. Faktanya, menetapkan penganalisis atau indexAnalyzer ke bidang yang telah dibuat secara fisik tidaklah diizinkan (meski Anda dapat mengubah properti searchAnalyzer kapan saja tanpa memengaruhi indeks).

Untuk mengubah penganalisis bidang yang sudah ada, Anda harus menghapus dan membuat ulang indeks sepenuhnya (Anda tidak dapat membuat ulang masing-masing bidang). 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 Perbarui Index untuk menggabungkan bidang baru dan mergeOrUpload untuk mengisinya. Kemudian, sebagai bagian dari pemberian layanan indeks terencana, Anda dapat membersihkan indeks untuk menghapus bidang yang 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:

"Pembaruan indeks tidak diizinkan karena dapat menyebabkan waktu henti. Untuk menambahkan filter karakter, filter token, pembuat token, atau penganalisis baru ke indeks yang sudah ada, atur parameter kueri ‘allowIndexDowntime’ ke ‘true’ dalam permintaan pembaruan indeks. Perhatikan bahwa operasi ini akan membuat indeks offline selama setidaknya beberapa detik, yang menyebabkan kegagalan permintaan kueri dan pengindeksan. Performa dan ketersediaan penulisan indeks dapat terganggu selama beberapa menit setelah indeks diperbarui, atau lebih lama untuk indeks yang sangat besar."

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 Cognitive Search memungkinkan Anda menentukan berbagai penganalisis 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. Jika pemrosesan teks berbeda pada waktu pencarian dan pengindeksan, Anda dapat mengalami risiko ketidakcocokan antara istilah kueri dan istilah terindeks saat konfigurasi penganalisis pencarian dan pengindeksan tidak diselaraskan.

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 hanya 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 opsi kustom tidak diatur, 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 mencakup atribut indeks tambahan 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 boleh 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, dengan menentukan jenis LexicalAnalyzerName yang menyediakan penganalisis teks yang didukung di Azure Cognitive 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);
}

Untuk contoh lainnya, lihat CustomAnalyzerTests.cs.

Langkah berikutnya

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

Untuk mempelajari selengkapnya tentang penganalisis, lihat artikel berikut: