Dalam skenario pencarian, pengguna sering menggunakan kata-kata berbeda untuk menyatakan konsep yang sama, seperti "cell phone" dan "smartphone." Hal ini dapat menyebabkan hasil pencarian yang tidak lengkap. Fitur sinonim mengatasi masalah ini dengan memperlakukan istilah-istilah tersebut sebagai setara, memperluas cakupan pencarian, meningkatkan tingkat recall, dan meningkatkan pengalaman pengguna.
Sebelum Anda mulai
Sebelum mengubah file sinonim, pastikan hal-hal berikut:
Pastikan indeks kritis memiliki setidaknya satu shard replika untuk menjaga ketersediaan layanan selama restart node tunggal. (Menghapus kamus memicu restart kluster.)
Monitor kluster untuk memastikan beban berada pada tingkat yang sehat (disarankan: Penggunaan CPU < 60%, Penggunaan memori heap < 50%).
Hubungkan ke kluster Anda dan jalankan
GET /_nodes/stats/jvm?filter_path=nodes.*.jvm.mem.heap_*untuk memeriksa Penggunaan CPU dan memori heap di semua node.
Cara kerja dan pengambilan keputusan
Panduan ini membandingkan dua metode konfigurasi sinonim beserta pertimbangan masing-masing untuk membantu Anda memilih pendekatan terbaik sesuai kebutuhan.
Aturan sintaks sinonim
File sinonim harus berupa file .txt ber-encoding UTF-8. Setiap baris dalam file mendefinisikan aturan sinonim dalam salah satu dari dua format berikut:
Sinonim setara (format Solr)
Istilah yang dipisahkan koma diperlakukan sebagai sepenuhnya setara. Pencarian satu istilah akan mencocokkan dokumen yang berisi istilah apa pun dalam kelompok tersebut.# Contoh: Pencarian "phone", "smartphone", dan "mobile phone" menghasilkan hasil yang sama. phone,smartphone,mobile phone ipod,i-pod,i podPemetaan searah (format WordNet)
Gunakan=>untuk memetakan sekumpulan istilah ke satu istilah kanonis. Ini sering digunakan untuk normalisasi, di mana istilah non-standar dipetakan ke istilah yang disukai.# Contoh: Petakan "usa" dan "us" ke "United States". usa,us => United States
Perbandingan metode konfigurasi
Anda dapat mengonfigurasi sinonim dengan mengunggah file atau menentukannya secara inline dalam konfigurasi indeks. Tabel berikut membandingkan kedua metode tersebut.
Item | Metode 1: Unggah file | Metode 2: Definisikan inline |
Cara mengonfigurasi | Unggah file .txt ke kluster dan rujuk dalam | Masukkan aturan sinonim langsung ke dalam |
Kelebihan |
|
|
Kekurangan | Indeks yang sudah ada tidak dapat memuat kamus baru secara dinamis. |
|
Kasus penggunaan | Gunakan ketika kamus stabil, jarang berubah, dan perlu dibagikan lintas beberapa indeks. | Gunakan ketika Ketersediaan tinggi sangat penting atau ketika Anda perlu memperbarui sinonim secara sering dan cepat. |
Prosedur
Metode 1: Unggah file sinonim (dapat digunakan kembali)
Metode ini paling cocok untuk kamus yang jarang berubah.
Langkah 1: Unggah file sinonim
Contoh ini menunjukkan cara mengonfigurasi sinonim menggunakan filter dengan file uji bernama aliyun_synonyms.txt, yang berisi entri: begin, start.
Masuk ke Konsol Alibaba Cloud Elasticsearch. Pilih Wilayah dan kelompok sumber daya tempat instans Anda berada, lalu klik ID instans target.
Di panel navigasi kiri, pilih Configuration and Management > Cluster Configuration. Di bagian Basic Configuration, temukan Synonym Configuration dan klik Upload.
Di panel yang muncul, klik Configure dan pilih metode unggah:
File harus memiliki ekstensi .txt. Nama file boleh berisi huruf kapital, huruf kecil, angka, dan garis bawah (_), serta tidak boleh melebihi 30 karakter.
Upload File: Pilih file .txt sinonim dari mesin lokal Anda.
Add OSS File: Masukkan nama bucket dan nama file sinonim, lalu klik Add.
Batasan: Bucket OSS harus berada di Wilayah yang sama dengan instans Alibaba Cloud Elasticsearch.
Klik Save dan konfirmasi operasi.
Langkah 2: Buat indeks dan rujuk file tersebut
Tunggu hingga instans kembali ke status Active. Kemudian, hubungkan ke kluster dan buat indeks yang menggunakan file sinonim yang diunggah.
PUT /aliyun-index-test
{
"settings": {
"index":{
"analysis": {
"analyzer": {
"by_smart": {
"type": "custom",
"tokenizer": "ik_smart",
"filter": ["by_tfr","by_sfr"],
"char_filter": ["by_cfr"]
},
"by_max_word": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": ["by_tfr","by_sfr"],
"char_filter": ["by_cfr"]
}
},
"filter": {
"by_tfr": {
"type": "stop",
"stopwords": [" "]
},
"by_sfr": {
"type": "synonym",
"synonyms_path": "analysis/aliyun_synonyms.txt"
}
},
"char_filter": {
"by_cfr": {
"type": "mapping",
"mappings": ["| => |"]
}
}
}
}
}
}Sintaks pembuatan indeks bervariasi tergantung versi kluster. Untuk informasi lebih lanjut, lihat Contoh operasi indeks untuk versi Elasticsearch umum.
Langkah 3: Konfigurasikan bidang title
Untuk versi Elasticsearch sebelum 7.0
PUT /aliyun-index-test/_mapping/doc { "properties": { "title": { "type": "text", "analyzer": "by_max_word", "search_analyzer": "by_smart" } } }Untuk Elasticsearch 7.0 dan versi setelahnya
PUT /aliyun-index-test/_mapping/ { "properties": { "title": { "type": "text", "analyzer": "by_max_word", "search_analyzer": "by_smart" } } }
Langkah 4: Verifikasi konfigurasi
Gunakan API _analyze untuk memverifikasi bahwa alat analisis telah memuat sinonim dengan benar. Contoh ini mengasumsikan file sinonim berisi begin,start.
GET /aliyun-index-test/_analyze
{
"analyzer": "by_smart",
"text":"begin"
}Tanggapan yang berhasil mencakup token begin dan start.
{
"tokens" : [
{
"token" : "begin",
"start_offset" : 0,
"end_offset" : 5,
"type" : "ENGLISH",
"position" : 0
},
{
"token" : "start",
"start_offset" : 0,
"end_offset" : 5,
"type" : "SYNONYM",
"position" : 0
}
]
}Langkah 5: Uji hasil pencarian
Indeks dua dokumen, masing-masing berisi salah satu istilah sinonim.
PUT /aliyun-index-test/doc/1 { "title": "Shall I begin?" }PUT /aliyun-index-test/doc/2 { "title": "I start work at nine." }Cari salah satu istilah, misalnya
begin. Pencarian akan mengembalikan dokumen yang berisibegindanstart.GET /aliyun-index-test/_search { "query" : { "match" : { "title" : "begin" }}, "highlight" : { "pre_tags" : ["<red>", "<blue>"], "post_tags" : ["</red>", "</blue>"], "fields" : { "title" : {} } } }Respons:
{ "took" : 70, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 0.28247005, "hits" : [ { "_index" : "aliyun-index-test", "_type" : "_doc", "_id" : "1", "_score" : 0.28247005, "_source" : { "title" : "Shall I begin?" }, "highlight" : { "title" : [ "Shall I <red>begin</red>?" ] } }, { "_index" : "aliyun-index-test", "_type" : "_doc", "_id" : "2", "_score" : 0.25069216, "_source" : { "title" : "I start work at nine." }, "highlight" : { "title" : [ "I <red>start</red> work at nine." ] } } ] } }
Metode 2: Konfigurasi inline (tidak dapat digunakan kembali)
Metode ini melibatkan penulisan aturan sinonim langsung ke dalam konfigurasi indeks dan paling cocok untuk kamus kecil yang memerlukan pembaruan sering.
Langkah 1: Buat indeks dan definisikan sinonim
Hubungkan ke kluster dan definisikan aturan sinonim langsung dalam array synonyms saat membuat indeks.
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_synonyms": {
"filter": [
"lowercase",
"my_synonym_filter"
],
"tokenizer": "ik_smart"
}
},
"filter": {
"my_synonym_filter": {
"synonyms": [
"begin,start"
],
"type": "synonym"
}
}
}
}
}Perintah ini membuat indeks bernama my_index dan mengonfigurasi analisis teks kustom. Berikut cara kerjanya:
Saat bidang teks menggunakan alat analisis my_synonyms, Pemisah kata ik_smart memecah teks input menjadi token. Filter lowercase kemudian mengonversi semua token menjadi huruf kecil. Terakhir, filter my_synonym_filter menerapkan aturan sinonim, memperlakukan token seperti begin dan start sebagai setara.
Langkah 2: Konfigurasikan bidang title
Untuk versi Elasticsearch sebelum 7.0
PUT /my_index/_mapping/doc { "properties": { "title": { "type": "text", "analyzer": "my_synonyms" } } }Untuk Elasticsearch 7.0 dan versi setelahnya
PUT /my_index/_mapping/ { "properties": { "title": { "type": "text", "analyzer": "my_synonyms" } } }
Langkah 3: Verifikasi konfigurasi
GET /my_index/_analyze
{
"analyzer":"my_synonyms",
"text":"Shall I begin?"
}Respons:
{
"tokens" : [
{
"token" : "shall",
"start_offset" : 0,
"end_offset" : 5,
"type" : "ENGLISH",
"position" : 0
},
{
"token" : "i",
"start_offset" : 6,
"end_offset" : 7,
"type" : "ENGLISH",
"position" : 1
},
{
"token" : "begin",
"start_offset" : 8,
"end_offset" : 13,
"type" : "ENGLISH",
"position" : 2
},
{
"token" : "start",
"start_offset" : 8,
"end_offset" : 13,
"type" : "SYNONYM",
"position" : 2
}
]
}Dampak operasi sinonim
Operasi sinonim yang berbeda memiliki dampak berbeda terhadap kluster. Memahami perbedaan ini dapat membantu Anda memilih metode pembaruan yang tepat sesuai kebutuhan bisnis.
Operasi | Memicu restart kluster | Deskripsi |
Pembaruan inkremental (mengunggah file dengan nama yang sama) | Tidak | Mengunggah file sinonim dengan nama yang sama seperti yang sudah ada merupakan pembaruan inkremental (hot update) dan tidak memicu restart kluster. |
Memperbarui kamus sinonim dari Update Synonym Dictionary (nama file baru atau penghapusan file) | Ya | Mengunggah file sinonim dengan nama baru atau menghapus file yang ada lalu menyimpan perubahan akan memicu restart bergulir kluster. |
Pembaruan inkremental (hot update)
Saat Anda mengunggah file sinonim dengan nama yang sama seperti yang sudah ada, sistem melakukan pembaruan inkremental (hot update), yang tidak memicu restart kluster. File baru menimpa file aslinya, dan indeks baru yang Anda buat secara otomatis menggunakan kamus yang diperbarui.
Setelah pembaruan inkremental, indeks yang sudah ada tidak secara otomatis memuat kamus baru. Untuk menerapkan perubahan ke indeks yang sudah ada, Anda harus menutup lalu membuka kembali indeks tersebut (Close/Open API), atau membangun ulang indeks.
Pembaruan Konsol yang memicu restart kluster
Operasi berikut memicu restart bergulir kluster:
Mengunggah file sinonim dengan nama baru dan menyimpan perubahan.
Menghapus file sinonim yang ada dan menyimpan perubahan.
Jika bisnis Anda memerlukan penghindaran restart kluster, kami merekomendasikan menggunakan plugin elasticsearch-analysis-dynamic-synonym untuk menerapkan pembaruan dinamis.
Restart bergulir dapat menimbulkan efek berikut:
jitter layanan: Selama restart bergulir di mana node direstart secara berurutan, Anda mungkin mengalami peningkatan sementara pada latensi kueri, bahkan jika Anda memiliki shard replika.
Risiko gangguan layanan: Dalam kondisi ekstrem, seperti beban kluster tinggi atau indeks tanpa shard replika, restart dapat menyebabkan beberapa permintaan gagal atau gangguan layanan singkat.
Durasi restart: Waktu total yang diperlukan untuk restart dan distribusi kamus bergantung pada ukuran kluster, volume data, dan beban. Proses ini dapat memakan waktu beberapa menit atau lebih lama.
Ketersediaan baca dan tulis selama perubahan
Setelah Anda mengirimkan konfigurasi sinonim, status instans berubah menjadi taking effect. Selama periode ini:
Operasi baca dan tulis untuk instans tidak terpengaruh dan tetap tersedia.
Fitur ekspansi sinonim sementara tidak tersedia, dan kueri pencarian yang bergantung pada aturan sinonim baru mungkin mengembalikan hasil yang tidak lengkap.
Setelah perubahan berlaku, status instans kembali ke Active, dan indeks baru yang dibuat secara otomatis menggunakan kamus sinonim yang diperbarui.
FAQ
Pemecahan masalah status Yellow atau perubahan macet
Jika status kluster berubah menjadi Yellow atau perubahan berikutnya diblokir setelah Anda mengonfigurasi atau memperbarui sinonim, periksa penyebab umum berikut:
File sinonim tidak diformat dengan benar: File berisi huruf kapital, yang menyebabkan alat analisis gagal saat Penguraian.
error OpenStorePlugin: Konten abnormal dalam file sinonim memicu error OpenStorePlugin. Hal ini mencegah alokasi shard secara benar, menyebabkan status kluster menjadi abnormal, dan memblokir perubahan berikutnya.
Untuk memecahkan dan mengatasi masalah ini, lakukan langkah-langkah berikut:
Periksa dan perbaiki file sinonim: Pastikan semua kata dalam file ditulis dalam huruf kecil. Setelah melakukan perbaikan, unggah kembali file tersebut.
Tambahkan filter lowercase: Dalam konfigurasi filter alat analisis di pengaturan indeks, tambahkan filter
lowercaseuntuk memastikan token secara otomatis dikonversi ke huruf kecil selama analisis. Contoh konfigurasi:"filter": { "my_synonym_filter": { "type": "synonym", "synonyms_path": "analysis/your-dict-name.txt" } }, "analyzer": { "my_synonyms": { "filter": ["lowercase", "my_synonym_filter"], "tokenizer": "ik_smart" } }Pulihkan indeks yang tidak beroperasi: Jika memodifikasi filter alat analisis mengharuskan Anda menutup atau membangun ulang indeks di lingkungan produksi, atau jika modifikasi alat analisis tidak memungkinkan di lingkungan produksi, coba pulihkan status kluster dengan memaksa realokasi shard:
POST /_cluster/reroute?retry_failed=true
Risiko plugin analysis-dynamic-synonym
Plugin open-source analysis-dynamic-synonym memungkinkan Anda memuat sinonim secara dinamis dari file remote atau lokal, yang menerapkan aturan sinonim baru tanpa merestart kluster. Namun, plugin ini memiliki risiko berikut:
Cacat konkurensi: Dalam skenario baca-tulis konkurensi tinggi, plugin ini dapat menyebabkan deadlock pada proses Elasticsearch, mengakibatkan Penggunaan CPU 100% dan layanan tidak tersedia.
Batasan kasus penggunaan: Gunakan plugin ini dengan hati-hati pada instans Serverless atau di lingkungan produksi dengan persyaratan stabilitas ketat. Sebelum mengaktifkannya, kami merekomendasikan mengevaluasi sepenuhnya stabilitasnya di bawah beban kueri dan tulis aktual Anda di Lingkungan pengujian. Jika sinonim tidak sering diperbarui, kami merekomendasikan menggunakan metode pembaruan inkremental (mengunggah file dengan nama yang sama) untuk menghindari risiko potensial dari plugin pihak ketiga.