2016-02-26 96 views
3

我使用ES 2.1,并具有以下映射:结合嵌套查询与过滤

"startDate": { 
    "type": "date", 
    "format": "yyyy-MM-dd HH:mm:ss:SSS||yyyy-MM-dd HH:mm:ss", 
    "index": "not_analyzed", 
    "store": true 
},"identities": { 
    "type": "nested", 
    "properties": { 
    "identityatt": { "type": "integer", "index": "not_analyzed", "store": true }, 
    "identitykey": { "type": "string", "index": "not_analyzed", "store": true }, 
    "identityval": { "type": "string", "index": "not_analyzed", "store": true }, 
    "identitytype": { "type": "integer", "index": "not_analyzed", "store": true } 
    } 
} 

下列查询是个好人,他们回到我所期望的:

{ "size": 50, 
    "query": { 
    "filtered": { 
     "filter": { 
     "range": { 
      "startDate": { 
      "from": "2016-02-19 11:11:25", 
      "to": "2016-02-27 11:11:25", 
      "include_lower": true, 
      "include_upper": true 
      } 
}}}}} 

这一个过滤器通过一个时间范围,并与下一个我想检索所有具有特殊的身份类型

{ 
    "size": 50, 
    "query": { 
    "nested": { 
     "path": "identities", 
     "filter": { 
     "term": { 
      "identities.identitytype": "2" 
     } 
}}}} 

但我似乎没有ge将这两者结合起来进行查询。

我试着将时间范围查询添加到嵌套过滤器中的过滤器,将两个过滤器都嵌套在一个bool过滤器中,我也试着用filtered查询,但没有把这两个过程结合起来。

查看https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html的示例,它也包含一个范围查询,不同之处在于它位于嵌套对象内,而我的startDate未包含在嵌套对象中。

有关如何组合这些查询的任何想法?

编辑

我也试了一下在此建议:Combined non-Nested and Nested Query in Elasticsearch并且得到错误"No query registered for [filter]"

{ 
    "size": 50, 
    "query": { 
    "bool": { 
    "must": [ 
    {"filter": { 
     "range": { 
      "startDate": { 
      "from": "2016-02-19 11:11:25", 
      "to": "2016-02-27 11:11:25", 
      "include_lower": true, 
      "include_upper": true 
      } 
     } 
     }}, 
     {"nested": { 
     "path": "identities", 
     "filter": { "bool": { "must": [{ 
     "term": { 
      "identities.identitytype": "2" 
     }, 
     "range": { 
      "startDate": { 
      "from": "2016-02-19 11:11:25", 
      "to": "2016-02-27 11:11:25", 
      "include_lower": true, 
      "include_upper": true 
      } 
     }}]} 
     } 
    } 
     } 
    ] 
    }}} 

回答

2

下面的查询应该工作。您不能在nested之内嵌套range查询,您需要将其保留在bool/must之外的同一级别。

{ 
    "size": 50, 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "range": { 
       "startDate": { 
        "from": "2016-02-19 11:11:25", 
        "to": "2016-02-27 11:11:25", 
        "include_lower": true, 
        "include_upper": true 
       } 
       } 
      }, 
      { 
       "nested": { 
       "path": "identities", 
       "filter": { 
        "term": { 
        "identities.identitytype": "2" 
        } 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
}