我正在使用Elasticsearch term suggester拼寫糾正。我的索引包含大量廣告。每個廣告都有主題和正文欄位。我發現了一個有問題的例子,建議者沒有提出正確的建議。
我有很多主題包含“沙發”一詞的廣告,還有 5 個主題包含“沙發”一詞的廣告。理想情況下,當我將“sofa”(拼寫錯誤)作為文本發送給建議者時,它應該回傳“soffa”(正確拼寫)作為建議(因為 soffa 是正確拼寫并且大多數廣告包含“soffa”,只有少數廣告包含“sofa "(拼寫錯誤))。
這是我的建議者查詢正文:
{
"suggest": {
"text": "sofa",
"subjectSuggester": {
"term": {
"field": "subject",
"suggest_mode": "popular",
"min_word_length": 1
}
}
}
}
當我發送上述查詢時,我得到以下回應:
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"suggest": {
"subjectSuggester": [
{
"text": "sof",
"offset": 0,
"length": 4,
"options": [
{
"text": "soff",
"score": 0.6666666,
"freq": 298
},
{
"text": "sol",
"score": 0.6666666,
"freq": 101
},
{
"text": "saf",
"score": 0.6666666,
"freq": 6
}
]
}
]
}
}
正如您在上面的回復中看到的,它回傳了“soff”,但沒有回傳“soffa”,盡管我有很多主題包含“soffa”的檔案。
我什至玩過類似的引數suggest_mode,string_distance但仍然沒有運氣。
我也用過phrase suggester,term suggester但還是一樣。這是我的短語建議查詢:
{
"suggest": {
"text": "sofa",
"subjectuggester": {
"phrase": {
"field": "subject",
"size": 10,
"gram_size": 3,
"direct_generator": [
{
"field": "subject.trigram",
"suggest_mode": "always",
"min_word_length":1
}
]
}
}
}
}
我不知何故認為當一個字符丟失而不是拼寫錯誤時它不起作用。在“soffa”示例中,缺少一個“f”。雖然它適用于拼寫錯誤,例如它適用于“vovlo”。當我發送“vovlo”時,它給了我“volvo”。
任何幫助將不勝感激。
uj5u.com熱心網友回復:
嘗試更改“string_distance”。
{
"suggest": {
"text": "sof",
"subjectSuggester": {
"term": {
"field": "title",
"min_word_length":2,
"string_distance":"ngram"
}
}
}
}
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html#term-suggester
uj5u.com熱心網友回復:
我自己找到了解決方法。我添加了帶有 3 的 ngram 過濾器和分析器,max_shingle_size這意味著三元組,然后使用該分析器(三元組)添加了一個子欄位,并對該欄位(而不是實際欄位)執行了建議查詢,并且它起作用了。
這是映射更改:
{
"settings": {
"analysis": {
"filter": {
"shingle": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 3
}
},
"analyzer": {
"trigram": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"shingle"
],
"char_filter": [
"diacritical_marks_filter"
]
}
}
}
},
"mappings": {
"properties": {
"subject": {
"type": "text",
"fields": {
"trigram": {
"type": "text",
"analyzer": "trigram"
}
}
}
}
}
}
這是我更正的查詢:
{
"suggest": {
"text": "sofa",
"subjectSuggester": {
"term": {
"field": "subject.trigram",
"suggest_mode": "popular",
"min_word_length": 1,
"string_distance": "ngram"
}
}
}
}
請注意,我正在執行建議subject.trigram而不是subject本身。
這是結果:
{
"suggest": {
"subjectSuggester": [
{
"text": "sofa",
"offset": 0,
"length": 4,
"options": [
{
"text": "soffa",
"score": 0.8,
"freq": 282
},
{
"text": "soffan",
"score": 0.6666666,
"freq": 5
},
{
"text": "som",
"score": 0.625,
"freq": 102
},
{
"text": "sol",
"score": 0.625,
"freq": 82
},
{
"text": "sony",
"score": 0.625,
"freq": 50
}
]
}
]
}
}
正如您在上面看到的,沙發是第一個建議。
uj5u.com熱心網友回復:
對于 word 的術語建議者,您的結果中有一些奇怪的地方,請sofa查看正在更正的文本:
"suggest": {
"subjectSuggester": [
{
"text": "sof",
"offset": 0,
"length": 4,
"options": [
{
"text": "soff",
"score": 0.6666666,
"freq": 298
},
{
"text": "sol",
"score": 0.6666666,
"freq": 101
},
{
"text": "saf",
"score": 0.6666666,
"freq": 6
}
]
}
]
}
正如您所看到的sof那樣sofa,這意味著更正不是針對sofa,而是針對sof,所以我懷疑這個問題與您在該領域使用的分析器有關,尤其是在查看結果soff而不是soffa洗掉最后一個時a
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/476913.html
