我在弹性搜索中有一些文档,带有完成建议器。我搜索像Stack这样的值,结果按以下顺序显示:
我希望结果按顺序显示:
即,应该首先匹配精确匹配而不是空格或特殊字符的结果。 TIA
答案 0 :(得分:1)
这一切都取决于您分析要查询的字符串的方式。我建议你在同一个字符串字段上应用多个分析器。下面是" name"的映射示例。您想要自动完成/建议功能的字段:
"name": {
"type": "string",
"analyzer": "keyword_analyzer",
"fields": {
"name_ac": {
"type": "string",
"index_analyzer": "string_autocomplete_analyzer",
"search_analyzer": "keyword_analyzer"
}
}
}
此处,keyword_analyzer和string_autocomplete_analyzer是索引设置中定义的分析器。以下是一个例子:
"keyword_analyzer": {
"type": "custom",
"filter": [
"lowercase"
],
"tokenizer": "keyword"
}
"string_autocomplete_analyzer": {
"type": "custom",
"filter": [
"lowercase"
,
"autocomplete"
],
"tokenizer": "whitespace"
}
此处自动填充功能是一种分析过滤器:
"autocomplete": {
"type": "edgeNGram",
"min_gram": "1",
"max_gram": "10"
}
设置完成后,在Elasticsearch中搜索自动建议时,您可以使用multiMatch查询而不是常规匹配查询,这里您可以为multiMatch中的各个字段提供增强功能。下面是java中的一个例子:
QueryBuilders.multiMatchQuery(yourSearchString,"name^3","name_ac");
您可能需要根据需要改变提升(^ 3)。
如果这甚至不满足您的要求,您可以考虑再使用一个分析器根据第一个单词分析字符串并在multiMatch中包含该字段。以下是此类分析仪的示例:
"first_word_name_analyzer": {
"type": "custom",
"filter": [
"lowercase"
,
"whitespace_merge"
,
"edgengram"
],
"tokenizer": "keyword"
}
使用这些分析过滤器:
"whitespace_merge": {
"pattern": "\s+",
"type": "pattern_replace",
"replacement": " "
},
"edgengram": {
"type": "edgeNGram",
"min_gram": "1",
"max_gram": "32"
}
您可能需要对增强值进行一些试验,以便根据您的要求达到最佳效果。希望这可以帮助。