2013-08-23 31 views
13

Tôi khá mới để elasticsearch và tôi muốn sử dụng từ đồng nghĩa, tôi đã thêm những dòng này trong file cấu hình:làm thế nào để cấu hình synonyms_path trong elasticsearch

index : 
    analysis : 
     analyzer : 
      synonym : 
       type : custom 
       tokenizer : whitespace 
       filter : [synonym] 
     filter : 
      synonym : 
       type : synonym 
       synonyms_path: synonyms.txt 

sau đó tôi đã tạo ra một bài kiểm tra chỉ số:

"mappings" : { 
    "test" : { 
    "properties" : { 
     "text_1" : { 
      "type" : "string", 
      "analyzer" : "synonym" 
     }, 
     "text_2" : { 
      "search_analyzer" : "standard", 
      "index_analyzer" : "synonym", 
      "type" : "string" 
     }, 
     "text_3" : { 
      "type" : "string", 
      "analyzer" : "synonym" 
     } 
    } 
    } 

}

và insrted một thử nghiệm loại với dữ liệu này:

{ 
"text_3" : "foo dog cat", 
"text_2" : "foo dog cat", 
"text_1" : "foo dog cat" 
} 
.210

synonyms.txt chứa "foo, quầy bar, baz", và khi tôi tìm kiếm foo nó sẽ trả về những gì tôi mong đợi nhưng khi tôi tìm kiếm baz hoặc thanh nó trở lại không có kết quả:

{ 
"query":{ 
"query_string":{ 
    "query" : "bar", 
    "fields" : [ "text_1"], 
    "use_dis_max" : true, 
    "boost" : 1.0 
}}} 

kết quả:

{ 
"took":1, 
"timed_out":false, 
"_shards":{ 
"total":5, 
"successful":5, 
"failed":0 
}, 
"hits":{ 
"total":0, 
"max_score":null, 
"hits":[ 
] 
} 
} 

Trả lời

17

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 
    } 
    ] 
} 
Các vấn đề liên quan