Elasticsearch:仅在嵌套文档存在的情况下执行过滤器

时间:2017-01-25 02:45:15

标签: elasticsearch elasticsearch-2.0

我使用的是ES 2.3,并且查询filter部分如下所示:

"filter": {
    "query": {
      "bool": {
        "must": [
          {
            "nested": {
              "path": "employees",
              "query": {
                "bool": {
                  "must": [ 
                    {
                      "range": {
                        "employees.max_age": {
                          "lte": 50
                        }
                      }
                    }, 
                    {
                      "range": {
                        "employees.min_age": {
                          "gte": 20
                        }
                      }
                    }
                  ]
                }
              }
            }
          }, 
          {
            "exists": {
              "field": "employees"
            }
          },
          {
            #....other filter here based on root document, not on nested employee document
          }
        ]
      }
    }
  }
}

我有一个过滤器,我在其中检查嵌套文档中的一些条件"员工"在一个更大的文档叫做公司,但是我想运行这个过滤器,只有"员工"对象存在,因为某些文档可能根本没有嵌套文档。所以我补充说,{"exists": {"field": "employees"}} 但这似乎不起作用。知道我应该做些什么改变才能让它发挥作用?

1 个答案:

答案 0 :(得分:0)

你可以这样做。但是,如果文档没有employees字段,则无论如何它们都不会被提取,因此我不确定您为什么要首先需要/ exists查询

{
  "filter": {
    "query": {
      "bool": {
        "must": [
          {
            "nested": {
              "path": "employees",
              "query": {
                "exists": {
                  "field": "employees"
                }
              }
            }
          },
          {
            "nested": {
              "path": "employees",
              "query": {
                "bool": {
                  "must": [
                    {
                      "range": {
                        "employees.max_age": {
                          "lte": 50
                        }
                      }
                    },
                    {
                      "range": {
                        "employees.min_age": {
                          "gte": 20
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        ]
      }
    }
  }
}