我有以下映射和分析器的索引:elasticsearch ngrams:爲什麼更短的標記匹配而不是更長?
settings: {
analysis: {
char_filter: {
custom_cleaner: {
# remove - and * (we don't want them here)
type: "mapping",
mappings: ["-=>", "*=>"]
}
},
analyzer: {
custom_ngram: {
tokenizer: "standard",
filter: [ "lowercase", "custom_ngram_filter" ],
char_filter: ["custom_cleaner"]
}
},
filter: {
custom_ngram_filter: {
type: "nGram",
min_gram: 3,
max_gram: 20,
token_chars: [ "letter", "digit" ]
}
}
}
},
mappings: {
attributes: {
properties: {
name: { type: "string"},
words: { type: "string", similarity: "BM25", analyzer: "custom_ngram" }
}
}
}
}
和我有在索引中的以下2個文件:
"name": "shirts", "words": [ "shirt"]
和
"name": "t-shirts", "words": ["t-shirt"]
我執行一個多匹配查詢,如
"query": {
"multi_match": {
"query": "t-shirt",
"fields": [
"words",
"name"
],
"analyzer": "custom_ngram"
}
}
的問題是:
球衣的得分爲1.17,而噸恤的得分爲0.8。 這是爲什麼,我怎麼能達到那t恤(直接匹配)有更高的分數?
我需要另一個用例,我必須檢測包含匹配的ngrams。 (襯衫穿在肌肉上,...)因此,我猜,我不能跳過牛仔褲。
謝謝!
謝謝你的回覆! 我會在一分鐘內試用。 我認爲*,我需要ngrams,因爲我想匹配「肌肉襯衫」以及。如果沒有ngram,這是可行的嗎? (實際上,它應該匹配肌肉襯衫和肌肉襯衫[對於錯誤的例子抱歉]) – udo
解釋告訴我,你是絕對正確的。 不應該char_filter去掉 - 從t恤? 當我分析T恤時,elasticsearch返回沒有 - (tsh,shi,hir,irt,...)的ngrams。 – udo
嗯。你是對的,這不太合理。你可以發佈解釋輸出嗎? – femtoRgon