0

我最近尝试从 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"
            }
         }
    }
}

结果似乎是正确的。但是还有其他更常见的方法吗?

4

2 回答 2

2

Vis 回答的更多信息

如果你想让“Harry Potter”也匹配“Harry blabla Potter”,你可以将query_string的phrase_slop 调整为大于 0 的值,这是匹配词之间的允许距离: - 默认为 0 表示需要完全匹配词组,没有其他词在搜索阶段之间 - 设置为 1 表示允许 1 个术语,因此“Harry blalal Potter”将匹配,但“Harry blabla bloblo Potter”不会。- ...

于 2013-09-20T08:01:12.897 回答
1

您需要将默认运算符设置为 AND 就像您已经找到的那样,或者使用

+Harry +Potter 

您在 query_string 查询中也用于 MySQL 的语法。

ElasticSearch 默认使用 OR,这就是为什么您对“Harry Potter”的 query_string 查询返回的结果仅包含一个单词。

仅当索引包含您在术语查询中输入的确切术语时,术语查询才会匹配,并且由于字符串“Harry Potter”与“Harry blabla Potter”不匹配,因此您没有得到匹配。

如果您想要另一种方式,您可以使用您拥有的布尔查询并使其包含两个单独的必须子句,一个用于“Harry”,一个用于“Potter”,但在这种情况下可能不需要。

于 2013-09-17T12:05:23.730 回答