我最近尝试从MySQL全文搜索迁移到ElasticSearch,但我对翻译一些查询感到有些困惑。
我有这个查询。
"SELECT * FROM Books WHERE MATCH (description) AGAINST ('+Harry +Potter' IN BOOLEAN MODE)"
这意味着无论顺序或位置如何,“ Harry”和“ Potter”都必须显示在说明列中。(为示例起见,请假设“ Harry”和“ Potter”可以彼此独立。)
我用ElasticSearch尝试过
{
"query": {
"query_string": {
"query": "Harry Potter",
"fields": ["description"]
}
}
}
但仍会给出一些仅包含“ Harry”或“ Potter”的结果。
我也尝试过
{
"query": {
"bool": {
"must" : {
"term" : { "description" : "Harry Potter" }
}
}
}
}
这个返回的所有结果都包含“ Harry Potter”,而不是“ Harry Bla Bla Bla Potter”和“ Potter Bla Bla Bla Harry”。
什么是最简单(或可能也是最快)的ElasticSearch查询,它与上述MySQL查询返回相同的结果。
更新
我刚发现像这样的东西
{
"query": {
"match" : {
"description" : {
"query" : "Harry Potter",
"operator" : "and"
}
}
}
}
结果似乎是正确的。但是还有其他更普遍的方式吗?
您需要像已经找到的那样将默认运算符设置为AND,或使用
+Harry +Potter
在query_string查询中还用于MySQL的语法。
ElasticSearch默认情况下使用OR,因此这就是您对“ Harry Potter”的query_string查询返回仅包含一个单词的结果的原因。
仅当索引包含您在术语查询中输入的确切术语时,术语查询才匹配,并且由于字符串“ Harry Potter”与“ Harry blabla Potter”不匹配,因此您没有找到匹配项。
如果您想要另一种方法,则可以使用所拥有的布尔查询,并使其包含两个单独的must子句,一个用于“ Harry”,一个用于“ Potter”,但是在这种情况下可能不需要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句