【问题标题】:Nested boolean queries in elastic search弹性搜索中的嵌套布尔查询
【发布时间】:2018-09-22 08:55:46
【问题描述】:

我正在尝试在弹性搜索中进行查询,该查询将执行以下操作: 我希望它检查具有 (metropolitan_area of​​ 16 AND starts_at of 05072013) OR (metropolitan_id of 16 AND starts_at "blank" 的结果。

这是我当前的查询,但我觉得它需要以某种方式嵌套,我不确定该怎么做。

{
  "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"}
        }
      ]
    }
  }
}

【问题讨论】:

标签: elasticsearch


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

andornot 查询在 elasticsearch 2.x 中已弃用。 Elasticsearch 文档建议改用 bool query。例如,您可以在过滤器上下文中编写嵌套布尔查询如下:

{
  "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"
              }
            }
          ]
        }
      }
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2015-09-24
    • 2020-07-26
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多