弹性搜索中的嵌套布尔查询

9
我正试图在Elasticsearch中进行查询,使其能够执行以下操作:我希望它检查具有以下条件的结果:(metropolitan_area为16且starts_at为05072013)或(metropolitan_id为16且starts_at为“空白”)。
这是我的当前查询,但我觉得它需要以某种方式嵌套,但我不确定如何做到这一点。
{
  "query" : { 
    "bool" : {
      "must" : [
        {
          "term" : {"user" : "a"}
        }, 
        { 
          "term" :{"metropolitan_area" : "16"}
        }
      ], 
      "must_not" : [], 
      "should" :   []
    }
  }, 
  "filter" : {
    "or" : {
      "filters" : [
        {
          "term" : {"user":"519"}
        }, 
        {
          "term" : {"user":"6"}
        }, 
        {
          "term" : {"user":"5"}
        }, 
        {
          "term" : {"user":"36"}
        }, 
        {
          "term" : {"starts_at":"05072013"}
        }, 
        {
          "term" : {"starts_at":"blank"}
        }
      ]
    }
  }
}

请参考以下内容:嵌套布尔查询 - Ricardo
2个回答

12

正确嵌套布尔表达式如下所示:

{
  "filter": {
    "or" : [{
       "and" : [
          { "term" : { "metropolian_area" : 16 } },
          { "term" : { "starts_at" : 0123213 } }
       ]
    }, {
       "and" : [
          { "term" : ... },
          { "term" : ... }
       ]
    }]
  }
}

你知道这个问题的答案吗?我尝试了各种方法,但仍然没有成功。https://dev59.com/dHbZa4cB1Zd3GeqPG4cP - Churro
我很忙,你能在这周晚些时候在freenode的#rom-rb频道中联系我吗?我认为我可以帮助你,看起来很简单。 - mbj
2
有没有一种方法可以使用“布尔查询”提供相同的功能? - Zouzias
1
http://www.elastic.co/guide/en/elasticsearch/guide/master/combining-filters.html#_nesting_boolean_filters - csdaraujo

6

andornot查询在elasticsearch 2.x中已被弃用。 Elasticsearch文档建议使用bool查询代替。例如,您可以将嵌套的bool查询写成如下的过滤器上下文:

{
  "query":{
    "bool":{
      "must":[
        {
          "term":{
            "user":"a"
          }
        },
        {
          "term":{
            "metropolitan_area":"16"
          }
        }
      ],
      "filter":{
        "bool":{
          "should":[
            {
              "term":{
                "user":"519"
              }
            },
            {
              "term":{
                "user":"6"
              }
            },
            {
              "term":{
                "user":"5"
              }
            },
            {
              "term":{
                "user":"36"
              }
            },
            {
              "term":{
                "starts_at":"05072013"
              }
            },
            {
              "term":{
                "starts_at":"blank"
              }
            }
          ]
        }
      }
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接