當使用帶有模糊性的Completion Suggester時,建議的結果排序是按字母順序排列的,而不是最相關的。似乎無論模糊設定為什么,都會在術語末尾從搜索/查詢術語中洗掉。這不是我在閱讀Completion Suggester Fuzziness 檔案時所期望的:
與查詢前綴共享最長前綴的建議將得分更高。
但事實并非如此。這是一個證明這一點的用例:
PUT test/
{
"mappings":{
"properties":{
"id":{
"type":"integer"
},
"title":{
"type":"keyword",
"fields": {
"suggest": {
"type": "completion"
}
}
}
}
}
}
POST test/_bulk
{ "index" : {"_id": "1"}}
{ "title": "HOLARAT" }
{ "index" : {"_id": "2"}}
{ "title": "HOLBROOK" }
{ "index" : {"_id": "3"}}
{ "title": "HOLCONNEN" }
{ "index" : {"_id": "4"}}
{ "title": "HOLDEN" }
{ "index" : {"_id": "5"}}
{ "title": "HOLLAND" }
上面創建了一個索引并添加了一些資料。
如果對所述資料進行了建議查詢:
POST test/_search
{
"_source": {
"includes": [
"title"
]
},
"suggest": {
"title-suggestion": {
"completion": {
"fuzzy": {
"fuzziness": "1"
},
"field": "title.suggest",
"size": 3
},
"prefix": "HOLL"
}
}
}
它以最后一個匹配字符的字母順序回傳前 3 個結果,而不是最長的前綴(應該是HOLLAND):
{
...
"suggest" : {
"title-suggestion" : [
{
"text" : "HOLL",
"offset" : 0,
"length" : 4,
"options" : [
{
"text" : "HOLARAT",
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_score" : 3.0,
"_source" : {
"title" : "HOLARAT"
}
},
{
"text" : "HOLBROOK",
"_index" : "test",
"_type" : "_doc",
"_id" : "2",
"_score" : 3.0,
"_source" : {
"title" : "HOLBROOK"
}
},
{
"text" : "HOLCONNEN",
"_index" : "test",
"_type" : "_doc",
"_id" : "3",
"_score" : 3.0,
"_source" : {
"title" : "HOLCONNEN"
}
}
]
}
]
}
}
如果大小引數被洗掉,那么我們可以看到所有條目的分數都是相同的,而不是最長的前綴如所述的更高。
在這種情況下,如何對定義了模糊性的 Completion Suggester 的結果進行排序,并在頂部使用最長的前綴?
uj5u.com熱心網友回復:
這已在過去報告,這種行為實際上是設計使然。
在這種情況下,我通常做的是發送兩個建議查詢(類似于這里建議的),一個用于精確匹配,另一個用于模糊匹配。如果完全匹配包含一個建議,我會使用它,否則我會使用模糊的。
使用下面的建議查詢,您將獲得HOLLANDas exact-suggestion,然后是模糊匹配項fuzzy-suggestion:
POST test/_search
{
"_source": {
"includes": [
"title"
]
},
"suggest": {
"fuzzy-suggestion": {
"completion": {
"fuzzy": {
"fuzziness": "1"
},
"field": "title.suggest",
"size": 3
},
"prefix": "HOLL"
},
"exact-suggestion": {
"completion": {
"field": "title.suggest",
"size": 3
},
"prefix": "HOLL"
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/476427.html
標籤:弹性搜索
