【发布时间】:2020-03-27 14:27:24
【问题描述】:
我正在尝试构建具有数百万个可能值的自动完成功能。我已经设法用两种不同的方法 match 和 ngram 来做到这一点。问题是 match 要求用户输入整个单词,而 ngram 返回的结果很差。如果没有匹配结果,有没有办法只返回 ngram 结果?
方法一:匹配
返回非常相关的结果,但需要用户输入完整的单词
//mapping
analyzer: {
std_english: {
type: 'standard',
stopwords: '_english_',
},
}
//search
query: {
bool: {
must: [
{ term: { semanticTag: type } },
{ match: { search } }
]}
}
方法二:ngram
返回差匹配
//mapping
analysis: {
filter: {
autocomplete_filter: {
type: 'edge_ngram',
min_gram: 1,
max_gram: 20,
},
},
analyzer: {
autocomplete: {
type: 'custom',
tokenizer: 'standard',
filter: ['lowercase', 'autocomplete_filter'],
},
},
//search
query: {
bool: {
must: [
{ term: { semanticTag: type } },
{ match: {
term: {
query: search,
operator: 'and',
}
}
}
]}
}
【问题讨论】:
-
不可能在一次调用中完成,但您可以查看opster.com/elasticsearch-glossary/… 以进一步优化,如果您需要更多信息和优化,请告诉我
标签: elasticsearch