MySQL全文搜索“ AND”布尔模式转换为ElasticSearch

佩特拉·巴鲁斯

我最近尝试从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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章