Tôi không biết, nếu vấn đề của bạn là do bạn đã xác định xấu từ đồng nghĩa cho "thanh". Như bạn nói bạn khá mới Tôi sẽ đặt một ví dụ tương tự như bạn làm việc. Tôi muốn cho thấy cách elasticsearch đối phó với các từ đồng nghĩa tại thời điểm tìm kiếm và tại thời điểm chỉ mục. Hy vọng nó giúp.
Điều đầu tiên tạo ra các tập tin từ đồng nghĩa:
foo => foo bar, baz
Bây giờ tôi tạo chỉ mục với các thiết lập cụ thể bạn đang cố gắng để kiểm tra:
curl -XPUT 'http://localhost:9200/test/' -d '{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "whitespace",
"filter": ["synonym"]
}
},
"filter" : {
"synonym" : {
"type" : "synonym",
"synonyms_path" : "synonyms.txt"
}
}
}
}
},
"mappings": {
"test" : {
"properties" : {
"text_1" : {
"type" : "string",
"analyzer" : "synonym"
},
"text_2" : {
"search_analyzer" : "standard",
"index_analyzer" : "standard",
"type" : "string"
},
"text_3" : {
"type" : "string",
"search_analyzer" : "synonym",
"index_analyzer" : "standard"
}
}
}
}
}'
Lưu ý rằng synonyms.txt phải nằm trong cùng thư mục tệp cấu hình từ đường dẫn đó liên quan đến thư mục cấu hình.
index Bây giờ một doc:
curl -XPUT 'http://localhost:9200/test/test/1' -d '{
"text_3": "baz dog cat",
"text_2": "foo dog cat",
"text_1": "foo dog cat"
}'
Bây giờ tìm kiếm
Tìm kiếm trong lĩnh vực văn bản_1
curl -XGET 'http://localhost:9200/test/_search?q=text_1:baz'
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.15342641,
"hits": [
{
"_index": "test",
"_type": "test",
"_id": "1",
"_score": 0.15342641,
"_source": {
"text_3": "baz dog cat",
"text_2": "foo dog cat",
"text_1": "foo dog cat"
}
}
]
}
}
Bạn nhận được tài liệu vì baz là đồng nghĩa của foo và lúc chỉ số foo được mở rộng với các từ đồng nghĩa
Searching trong lĩnh vực văn bản_2
curl -XGET 'http://localhost:9200/test/_search?q=text_2:baz'
kết quả:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
Tôi không nhận được hit vì tôi không mở rộng từ đồng nghĩa khi lập chỉ mục (tiêu chuẩn phân tích). Và, vì tôi đang tìm kiếm baz và baz không có trong văn bản, tôi không nhận được bất kỳ kết quả nào.
Tìm kiếm trong lĩnh vực text_3
curl -XGET 'http://localhost:9200/test/_search?q=text_3:foo'
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.15342641,
"hits": [
{
"_index": "test",
"_type": "test",
"_id": "1",
"_score": 0.15342641,
"_source": {
"text_3": "baz dog cat",
"text_2": "foo dog cat",
"text_1": "foo dog cat"
}
}
]
}
}
Lưu ý: text_3 là "con chó baz mèo"
text_3 là chỉ số mà không cần mở rộng từ đồng nghĩa. Khi tôi đang tìm kiếm foo, có "baz" là một trong những từ đồng nghĩa tôi nhận được kết quả.
Nếu bạn muốn gỡ lỗi bạn có thể sử dụng thiết bị đầu cuối _analyze
ví dụ:
curl -XGET 'http://localhost:9200/test/_analyze?text=foo&analyzer=synonym&pretty=true'
kết quả:
{
"tokens": [
{
"token": "foo",
"start_offset": 0,
"end_offset": 3,
"type": "SYNONYM",
"position": 1
},
{
"token": "baz",
"start_offset": 0,
"end_offset": 3,
"type": "SYNONYM",
"position": 1
},
{
"token": "bar",
"start_offset": 0,
"end_offset": 3,
"type": "SYNONYM",
"position": 2
}
]
}