MySQL全文搜索“AND”BOOLEAN模式到ElasticSearch

时间:2013-09-16 10:00:39

标签: mysql elasticsearch

我最近尝试从MySQL全文搜索迁移到ElasticSearch,我对翻译某些查询感到困惑。

我有这个问题。

 "SELECT * FROM Books WHERE MATCH (description) AGAINST ('+Harry +Potter' IN BOOLEAN MODE)"

这意味着无论顺序或位置如何,“Harry”和“Potter”都必须显示在说明栏中。 (例如,请假设“哈利”和“波特”可以相互独立。)

我使用ElasticSearch

尝试了这个
{
    "query": {
        "query_string": {
            "query": "Harry Potter",
            "fields": ["description"]
        }
    }
}

但它仍然会给出一些仅包含“Harry”或“Potter”的结果。

我也试过这个,

{
    "query": {
        "bool": {
           "must" : {
               "term" : { "description" : "Harry Potter" }
           }
        }
    }
}

这一个返回所有结果包含“哈利波特”,而不是“哈利Bla Bla Bla Potter”和“Potter Bla Bla Bla Harry”。

最简单(或可能也是最快)的ElasticSearch查询是什么,它返回与上述MySQL查询相同的结果。

更新

我刚发现这样的事情

{
    "query": {
        "match" : {
            "description" : {
                "query" : "Harry Potter",
                "operator" : "and"
            }
         }
    }
}

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

2 个答案:

答案 0 :(得分:2)

Vis'回答

的更多信息

如果你想“哈利波特”也匹配“哈利布拉布波特”,你可以将query_string的 phrase_slop 调整为某些事情> 0,这是匹配条件之间的允许距离:   - 默认为0表示需要精确的词组匹配,搜索阶段之间不存在其他术语   - 设置为1意味着它之间允许1个术语,所以“Harry blalal Potter”将匹配,但“Harry blabla bloblo Potter”不会。   - ......

答案 1 :(得分:1)

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

+Harry +Potter 

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

ElasticSearch默认使用OR,这就是为什么查询“哈利波特”的query_string返回的结果只包含其中一个单词。

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

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