我们使用 ElasticSearch 搜索数百万个标签。我们的用户应该能够包含 bool 运算符(+、-、“xy”、AND、OR、括号)。如果没有返回匹配项,我们将退回到 ES 提供的拼写建议并再次搜索。那是我们的查询:
$ curl -XGET 'http://127.0.0.1:9200/my_index/my_type/_search' -d '
{
"query" : {
"query_string" : {
"query" : "some test query +bools -included",
"default_operator" : "AND"
}
},
"suggest" : {
"text" : "some test query +bools -included",
"simple_phrase" : {
"phrase" : {
"field" : "my_tags_field",
"size" : 1
}
}
}
}
我们希望启用模糊匹配,而不是仅提供拼写建议的回退。例如,如果用户搜索“stackoverfolw”,ES 应该返回“stackoverflow”的匹配项。
附加问题:“更正”拼写错误的性能更好的方法是什么?现在,我们必须执行两个后续请求,首先使用原始搜索词,然后使用 ES 建议的词。
最佳答案
query_string 确实支持一些模糊性,但仅在使用 ~ 运算符时才支持,我认为这不是您的用例。我会添加 fuzzy query然后将其放入或与现有的 query_string 一起。例如,您可以使用 bool query并将模糊查询添加为 should 子句,将原始 query_string 保留为 must 子句。
关于如何纠正拼写错误的附加问题:如果您希望用户从列表中选择正确的更正(例如,您的意思是),我会使用模糊查询来自动更正拼写错误和两个后续请求,但是您的方法听起来也不错。
关于performance - 如何在 ElasticSearch 中为短语查询启用模糊性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18677771/