下面是我的設定。我在 ElasticSearch 中插入一個用戶,我正在做加權模糊用戶名搜索。問題是模糊性可能會……更模糊?我告訴你我的意思,這段代碼是我的映射:
{
"mappings": {
"properties": {
"user_id": {
"enabled": false
},
"username": {
"type": "text"
},
"d_likes": {
"type": "rank_feature"
}
}
}
}
我正在插入 2 個用戶:
- user_id:隨機,用戶名:pietje,d_likes:3
- user_id:隨機,用戶名:p13tje,d_likes:30
現在的問題是我需要在用戶名欄位中寫入大量字符才能獲得點擊量。這就是我搜索的方式:
{
"query": {
"bool": {
"must": [
{
"match": {
"username": {
"query": "piet",
"fuzziness": "auto"
}
}
}
],
"should": [
{
"rank_feature": {
"field": "d_likes"
}
}
]
}
}
}
'piet' 沒有結果。這對我來說看起來很奇怪,我希望我能真正看到 p13tje 和 pietje(按這個順序),因為它們非常相似。當我的搜索查詢是 pietj 時,我只會得到 pietje 而不是 p13tje。
所以我想知道如何通過模糊搜索獲得更多點擊率?我想要用戶名的自動完成功能,這是非常糟糕的用戶體驗,因為它只在您填寫了大部分字符時才提供自動完成功能。我只是希望搜索更加寬松并提供更多結果。
uj5u.com熱心網友回復:
彈性搜索檔案:
在查詢文本或關鍵字欄位時,模糊性被解釋為Levenshtein 編輯距離——需要對一個字串進行的一個字符更改的數量,以使其與另一個字串相同。
所述的Levenshtein編輯距離基本上是測量2個字串值之間的差異的一種方式。
您已將fuzziness引數設定為AUTO,這是一個很好的默認決定。但是,對于像您這樣的一些短字串,事實證明它并不像您希望的那樣模糊。
這是因為 ElasticSearch (ES) 將根據字串的長度生成編輯距離,這將確定索引中的字串與您的搜索查詢有多少編輯距離。
您沒有為 指定任何特定值low或high值piet,因為它是一個 4 個字符的字串,所以只允許進行一次編輯。
pietje實際上需要進行兩次編輯 -piet需要一個j和一個,e所以它不會出現。
p13tje實際上是四次編輯 - 它需要一個j,一個e,從1到i的更改和從3到的更改,e因此它也不會顯示。
ES 模糊搜索允許的最大 Levenshtein 編輯距離為 2(較大的差異對于有效計算而言要昂貴得多,并且不會由 ES 所基于的 Lucene 搜索引擎處理),因此要解決此問題,請將其設定fuzziness為2手動。
"match": {
"username": {
"query": "piet",
"fuzziness": "2"
}
}
希望這至少會允許pietje出現在搜索中,甚至可能p13tje取決于是否有任何其他匹配項。
除了手動將其設定為 2,您還可以設定低距離和高距離引數,AUTO但這會產生更差的結果(格式為AUTO:[low],[high]eg AUTO:15,30)。
例如,最低為 8,最高為 20:
- 字符長度為 8 或以下的用戶名將不會進行任何模糊搜索,因為它必須是完全匹配的
- 字符長度在 9 到 20 之間的用戶名將只允許 1 次編輯
- 字符長度為 21 或更高的用戶名將只允許 2 編輯
如果愿意,您可以嘗試調整低值和高值,但對于...最模糊的情況,請將編輯距離設定為允許的最大 Levenshtein 編輯距離 (2)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/320918.html
標籤:弹性搜索
