我正在使用ngram分析器使用elasticsearch在特定字段上进行自动完成搜索。 默认情况下,我使用" size:10"将结果数设置为10。在查询中。
但我想要的是,当我的搜索接近完全匹配时,弹性搜索返回的结果应该减少
例如
如果搜索:"fl"
将返回:"flake", "flower", "fleet", "flank", "flatter"
。
如果正在搜索:"fla"
将返回:"flan","flank", "flatter"
。
如果正在搜索:"flan"
将返回:"flan","flank"
。
现在即使我搜索"flan"
,也会返回所有结果
我也在使用语音搜索。
答案 0 :(得分:1)
如果您的数据不是多语言(仅当数据语言只是英语)时,此答案适用
使用自定义分析器。您可以将分析仪名称设置为默认(而不是myAnalyzer),如果您希望在所有情况下都将其作为默认分析仪。
index :
analysis :
analyzer :
myAnalyzer :
type : custom
tokenizer : whitespace
filter : [word_filter, lowercase, stop]
filter :
word_filter :
type : word_delimiter
split_on_numerics : false
generate_word_parts : false
generate_number_parts : false
split_on_case_change : false
preserve_original : false
PS:您需要创建索引并在此更改后重新索引整个数据。
答案 1 :(得分:0)
显着减少延迟的一种方法是使用digrams或trigrams,而不是使用unigram作为min_gram。否则,如果用户只键入一个字母(例如“a”),则数据库中可能会有数十万个结果,这对用户来说甚至不会“远程相关”(效率非常低)。
您可以使用此类过滤器:
{
"filter":
{
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 3,
"max_gram": 20
}
}
}
这将通过删除不相关的结果来显着减少结果数量,从而提高软件的效率。
您可以查看this页面了解完整文档。
为了制作更好的建议者,我建议您浏览this。这不仅会根据给定的查询限制您的结果(只是您想要的方式),还会大大提高软件的效率!