【发布时间】:2017-03-04 14:01:57
【问题描述】:
我有一些带有完成建议的弹性搜索文档。我搜索一些像 Stack 这样的值,结果如下所示:
- 堆栈溢出
- 堆栈溢出
- 堆栈
- 堆栈覆盖
- 堆栈溢出
我希望结果按顺序显示:
- 堆栈
- 堆栈覆盖
- 堆栈溢出
- 堆栈溢出
- 堆栈溢出
即,精确匹配应该放在第一位,而不是空格或特殊字符的结果。 TIA
【问题讨论】:
标签: elasticsearch
我有一些带有完成建议的弹性搜索文档。我搜索一些像 Stack 这样的值,结果如下所示:
我希望结果按顺序显示:
即,精确匹配应该放在第一位,而不是空格或特殊字符的结果。 TIA
【问题讨论】:
标签: elasticsearch
这完全取决于您分析所查询字符串的方式。我建议您在同一个字符串字段上应用多个分析器。以下是您想要自动完成/建议功能的“名称”字段的映射示例:
"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"
}
您可能需要对提升值进行一些试验,以便根据您的要求达到最佳结果。希望这可以帮助。
【讨论】: