匹配具有多个或条件的弹性搜索查询

时间:2017-03-14 15:11:22

标签: elasticsearch

我有三个字段statustypesearch。我想要搜索的数据包含status等于NEWstatus等于IN PROGRESStype等于abctype等于xyzsearch包含(部分匹配)。

我的电话如下所示 -

{
 "query": {
  "bool" : {
      "must" : [{
                "match": {
                "status": {
                    "query": "abc",
                    }
                }
                }, {
                    "match": {
                    "type": {
                        "query": "NEW",
                        }
                    }
                },{
                    "query_string": {
                        "query": "*abc*",    /* for partial search */
                        "fields": ["title", "name"]
                    }
                }]
        }
    }
}

1 个答案:

答案 0 :(得分:1)

嵌套你的boolqueries。我想你缺少的是:

"bool": { "should": [ 
   { "match": { "status": "abc" } }, 
   { "match": { "status": "xyz" } } 
]}

这是一个必须匹配其中一个should子句的查询,因为只应给出子句。

编辑解释差异:

{
   "query": {
      "bool": {
         "must": [
            {
               "bool": {
                  "should": [
                     {
                        "match": {
                           "status": "abc"
                        }
                     },
                     {
                        "match": {
                           "status": "xyz"
                        }
                     }
                  ]
               }
            },
            {
               "terms": {
                  "type": [
                     "NEW",
                     "IN_PROGRESS"
                  ]
               }
            },
            {
               "query_string": {
                  "query": "*abc*",
                  "fields": [
                     "title",
                     "name"
                  ]
               }
            }
         ]
      }
   }
}

所以你在顶部有一个boolquery。 3个内部查询中的每一个都必须为真。

  1. 第一个是嵌套的boolquery,如果status匹配abc或xyz,则为true。
  2. 如果类型匹配完全 NEW或IN_PROGRESS,则第二个为真 - 注意这里的区别。第一个也匹配ABC或aBc或潜在的" abc XYZ"取决于您的分析仪。您可能需要两者的术语。
  3. 第三个是你以前的。