elasticsearch,Mysql,elasticsearch" /> elasticsearch,Mysql,elasticsearch" />

MySQL全文搜索“;及;ElasticSearch的布尔模式

MySQL全文搜索“;及;ElasticSearch的布尔模式,mysql,elasticsearch,Mysql,elasticsearch,我最近尝试从MySQL全文搜索迁移到ElasticSearch,但我对翻译一些查询有点困惑 我有这个疑问 "SELECT * FROM Books WHERE MATCH (description) AGAINST ('+Harry +Potter' IN BOOLEAN MODE)" 这意味着无论顺序或位置如何,“哈利”和“波特”都必须显示在描述栏中。(为了举例,请假设“哈利”和“波特”可以相互独立。) 我用ElasticSearch试过了 { "query": {

我最近尝试从MySQL全文搜索迁移到ElasticSearch,但我对翻译一些查询有点困惑

我有这个疑问

 "SELECT * FROM Books WHERE MATCH (description) AGAINST ('+Harry +Potter' IN BOOLEAN MODE)"
这意味着无论顺序或位置如何,“哈利”和“波特”都必须显示在描述栏中。(为了举例,请假设“哈利”和“波特”可以相互独立。)

我用ElasticSearch试过了

{
    "query": {
        "query_string": {
            "query": "Harry Potter",
            "fields": ["description"]
        }
    }
}
但它仍然给出了一些只包含“哈利”或“波特”的结果

我也试过这个

{
    "query": {
        "bool": {
           "must" : {
               "term" : { "description" : "Harry Potter" }
           }
        }
    }
}
这一个返回所有包含“哈利·波特”的结果,而不是“哈利·布拉·布拉·波特”和“哈利·布拉·布拉·哈利”

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

更新

我刚刚发现了这样的东西

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

结果似乎差不多。但是还有其他更常见的方法吗?

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

+Harry +Potter 
您在查询字符串查询中还使用了MySQL的语法

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

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


如果您想要另一种方式,您可以使用已有的布尔查询,并使其包含两个单独的must子句,一个用于“Harry”,另一个用于“Potter”,但在本例中可能不需要这样做。

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

+Harry +Potter 
您在查询字符串查询中还使用了MySQL的语法

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

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


如果你想用另一种方法,你可以使用你的布尔查询,让它包含两个独立的必选子句,一个表示“Harry”,一个表示“Potter”,但在本例中可能不需要这样做。

有关Vis答案的更多信息

如果您希望“哈利波特”也匹配“哈利·布拉布拉·波特”,您可以将查询字符串的短语斜率调整为somethings>0,这是匹配项之间允许的距离: -默认值为0表示需要精确的短语匹配,搜索阶段之间不需要其他术语 -设置为1意味着允许它之间有一个术语,所以“哈利·布拉拉尔·波特”将匹配,但“哈利·布拉布拉·布洛·波特”将不匹配。
-…

有关Vis答案的更多信息

如果您希望“哈利波特”也匹配“哈利·布拉布拉·波特”,您可以将查询字符串的短语斜率调整为somethings>0,这是匹配项之间允许的距离: -默认值为0表示需要精确的短语匹配,搜索阶段之间不需要其他术语 -设置为1意味着允许它之间有一个术语,所以“哈利·布拉拉尔·波特”将匹配,但“哈利·布拉布拉·布洛·波特”将不匹配。 -