Alibaba Cloud Elasticsearch, arama için eş anlamlıları yapılandırmak üzere iki yöntem destekler: bir eş anlamlı sözlük dosyasını kümeye yüklemek veya dizin ayarlarında eş anlamlıları satır içi olarak tanımlamak. Her iki yaklaşım da özel bir çözümleyicideki eş anlamlı belirteç filtresini kullanır.
Bu konudaki tüm komutları Kibana konsolundan çalıştırın. Erişim talimatları için bkz. Kibana konsolunda oturum açma.
Yöntem 1: Eş anlamlı sözlük dosyası kullanma
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Kümeye yüklenmiş bir eş anlamlı sözlük dosyası. Bkz. Eş anlamlı sözlük dosyası yükleme.
Aşağıdaki örneklerde, begin, start girişini içeren analysis/aliyun_synonyms.txt dosyası kullanılmaktadır.
Adım 1: Dizin oluşturma
Yüklenen eş anlamlı dosyasına başvuran özel bir çözümleyici ile bir dizin oluşturun:
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": ["| => |"]
}
}
}
}
}
}
by_sfr filtresi, eş anlamlıları yüklenen sözlük dosyasından alır. by_max_word çözümleyicisi dizine ekleme için, by_smart ise arama sorguları için kullanılır.
Adım 2: Eşlemeyi yapılandırma
title alanını özel çözümleyicileri kullanacak şekilde eşleyin. Komut, küme sürümüne göre farklılık gösterir.
-
Elasticsearch 7.0 veya sonraki sürümler:
PUT /aliyun-index-test/_mapping/ { "properties": { "title": { "type": "text", "analyzer": "by_max_word", "search_analyzer": "by_smart" } } } -
Elasticsearch 7.0'dan önceki sürümler:
PUT /aliyun-index-test/_mapping/doc { "properties": { "title": { "type": "text", "analyzer": "by_max_word", "search_analyzer": "by_smart" } } }
Açık kaynaklı Elasticsearch 7.0 ve sonraki sürümlerde eşleme türleri kullanımdan kaldırılmıştır ve _doc otomatik olarak kullanılır. Yolda bir eşleme türü belirtmeyin. Belirtirseniz hata döndürülür.
Adım 3: Çözümleyiciyi doğrulama
Bir test terimini analiz ederek eş anlamlı filtrenin çalıştığını onaylayın:
GET /aliyun-index-test/_analyze
{
"analyzer": "by_smart",
"text":"begin"
}
Yanıt, aynı konumda hem begin (tür ENGLISH) hem de start (tür SYNONYM) içermelidir:
{
"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
}
]
}
Adım 4: Test belgeleri ekleme
Farklı ancak eş anlamlı terimler içeren iki belgeyi dizine ekleyin.
-
Elasticsearch 7.0 veya sonraki sürümler:
PUT /aliyun-index-test/_doc/1 { "title": "Shall I begin?" }PUT /aliyun-index-test/_doc/2 { "title": "I start work at nine." } -
Elasticsearch 7.0'dan önceki sürümler:
PUT /aliyun-index-test/doc/1 { "title": "Shall I begin?" }PUT /aliyun-index-test/doc/2 { "title": "I start work at nine." }
Adım 5: Eş anlamlı aramasını test etme
begin için arama yapın ve start içeren belge dahil olmak üzere her iki belgenin de döndürüldüğünü doğrulayın:
GET /aliyun-index-test/_search
{
"query" : { "match" : { "title" : "begin" }},
"highlight" : {
"pre_tags" : ["<red>", "<bule>"],
"post_tags" : ["</red>", "</bule>"],
"fields" : {
"title" : {}
}
}
}
Başarılı bir yanıt, eşleşen terimler vurgulanmış olarak her iki belgeyi de döndürür:
{
"took": 11,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.41048482,
"hits": [
{
"_index": "aliyun-index-test",
"_type": "doc",
"_id": "2",
"_score": 0.41048482,
"_source": {
"title": "I start work at nine."
},
"highlight": {
"title": [
"I <red>start</red> work at nine."
]
}
},
{
"_index": "aliyun-index-test",
"_type": "doc",
"_id": "1",
"_score": 0.39556286,
"_source": {
"title": "Shall I begin?"
},
"highlight": {
"title": [
"Shall I <red>begin</red>?"
]
}
}
]
}
}
begin ve start eş anlamlı olarak tanımlandığından her iki belge de eşleşir.
Yöntem 2: Satır içi eş anlamlıları tanımlama
Bu yöntem, synonyms parametresini kullanarak eş anlamlı kurallarını doğrudan dizin settings bölümüne yerleştirir. Sık güncelleme gerektirmeyen basit ve kararlı eş anlamlı kümeleri için bu yaklaşımı kullanın.
Adım 1: Satır içi eş anlamlılarla dizin oluşturma
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"
}
}
}
}
}
Bu yapılandırma aşağıdaki işlemleri gerçekleştirir:
Satır içi eş anlamlı kuralı
begin,startile bir eş anlamlı filtresi (my_synonym_filter) tanımlar.ik_smartbelirteçleyicisini kullanarakmy_synonymsçözümleyicisini oluşturur.Belirteçlemeden sonra, tüm belirteçlere
lowercasevemy_synonym_filteruygular.
Adım 2: Eşlemeyi yapılandırma
-
Elasticsearch 7.0 veya sonraki sürümler:
PUT /my_index/_mapping/ { "properties": { "title": { "type": "text", "analyzer": "my_synonyms" } } } -
Elasticsearch 7.0'dan önceki sürümler:
PUT /my_index/_mapping/doc { "properties": { "title": { "type": "text", "analyzer": "my_synonyms" } } }
Açık kaynaklı Elasticsearch 7.0 ve sonraki sürümlerde eşleme türleri kullanımdan kaldırılmıştır ve _doc otomatik olarak kullanılır. Yolda bir eşleme türü belirtmeyin. Belirtirseniz hata döndürülür.
Adım 3: Çözümleyiciyi doğrulama
GET /my_index/_analyze
{
"analyzer":"my_synonyms",
"text":"Shall I begin?"
}
Yanıt, aynı konumda begin (tür ENGLISH) ve start (tür SYNONYM) içerir; bu durum eş anlamlı filtrenin etkin olduğunu doğrular:
{
"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
}
]
}
Adım 4: Test belgeleri ekleme
-
Elasticsearch 7.0 veya sonraki sürümler:
PUT /my_index/_doc/1 { "title": "Shall I begin?" }PUT /my_index/_doc/2 { "title": "I start work at nine." } -
Elasticsearch 7.0'dan önceki sürümler:
PUT /my_index/doc/1 { "title": "Shall I begin?" }PUT /my_index/doc/2 { "title": "I start work at nine." }
Adım 5: Eş anlamlı aramasını test etme
GET /my_index/_search
{
"query" : { "match" : { "title" : "begin" }},
"highlight" : {
"pre_tags" : ["<red>", "<bule>"],
"post_tags" : ["</red>", "</bule>"],
"fields" : {
"title" : {}
}
}
}
Yanıt her iki belgeyi de döndürür:
{
"took": 11,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.41913947,
"hits": [
{
"_index": "my_index",
"_type": "doc",
"_id": "2",
"_score": 0.41913947,
"_source": {
"title": "I start work at nine."
},
"highlight": {
"title": [
"I <red>start</red> work at nine."
]
}
},
{
"_index": "my_index",
"_type": "doc",
"_id": "1",
"_score": 0.39556286,
"_source": {
"title": "Shall I begin?"
},
"highlight": {
"title": [
"Shall I <red>begin</red>?"
]
}
}
]
}
}