结合和与或条件

时间:2014-06-09 20:42:06

标签: elasticsearch

我坚持一个必须结合某些条件的查询。

目录的这些属性如下

  • _id:整数
  • parentID:integer
  • 路径:字符串
  • 级别:整数

我完全不知道如何组合它们,以便查询返回我需要的内容。

  • a)_id必须是给定列表("_id": ["7","10"])OR
  • 之一
  • b)parentID必须是给定的整数("_parentID": "1")OR
  • c)路径必须匹配特殊模式("regexp": {"path": "/foobar.*"})并且级别介于两个整数("range": {"level": {"gte": 2, "lte": 3 } })之间

另外,所有条目都必须来自一个已定义的目录

我不会写下我的所有尝试。我尝试使用必须和应该使用bool查询,但这不适用于c):

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "type": {
                "value": "category"
              }
            }
          ],
          "should": [
            {
              "regexp": {
                "path": "/foobar.*"
              }
            },
            {
              "range": {
                "level": {
                  "gte": 2,
                  "lte": 3
                }
              }
            },
            {
              "term": {
                "_id": [
                  "7",
                  "10"
                ]
              }
            }
          ]
        }
      }
    }
  }
}

结合和/或条件的最佳方式是什么?我有点失落。

1 个答案:

答案 0 :(得分:0)

我认为这应该非常接近你所需要的。

GET devdev/alert/_search
{
    "filter": {
        "or": {
           "filters": [
              {
                   "terms": {
                      "_id": [
                         "eee75eJpRua4HasVzz0PeA",
                         "VALUE2"
                      ]
                   }
              },
              {
               "term": {
                  "_parentID": "SE.SE.0000"
               }   
              },
              {
               "and": {
                     "filters": [
                        {
                            "term": {
                               "regexp": "foobar"
                            }
                        },
                        {
                         "range": {
                            "level": {
                               "from":  2,
                               "to": 3
                            }
                         }   
                        }
                     ]
                  }   
              }
           ]
        }
    }
}