Elasticsearch 5.2嵌套查询多项

时间:2017-03-02 10:53:12

标签: elasticsearch nested

嵌套文档看起来像这样

{
    "userid": "123",
    "usertag": [
        {
            "tag": "A",
            "logcreatetime": "2017-01-14"
        },
        {
            "tag": "C",
            "logcreatetime": "2017-01-17"
        }
    ]
},
{
    "userid": "456",
    "usertag": [
        {
            "tag": "A",
            "logcreatetime": "2017-01-12"
        },
        {
            "tag": "B",
            "logcreatetime": "2017-01-19"
        }
    ]
},
..... 

usertag对象是嵌套映射, 如何在2017-01-12到2017-01-19之间获得用户ID,是否有标签A和B? 谢谢 对不起我的英文。

1 个答案:

答案 0 :(得分:1)

我假设您已将logcreatetime编入索引作为日期字段,因此您可以使用以下查询:

curl -XGET http://localhost:9200/my_users/_search -d '
{
  "query": {
    "bool": {
      "must": [ {
        "nested": {
          "path": "usertag",
          "query": {
            "bool": {
              "must": [
                { "match": { "usertag.tag": "A" }},
                { "range" : {
                    "usertag.logcreatetime" : {
                      "gte": "2017-01-12",
                      "lte": "2017-01-19"
                    }
                }}
              ]
            }
          }
        }
      }, {
        "nested": {
          "path": "usertag",
          "query": {
            "bool": {
              "must": [
                { "match": { "usertag.tag": "B" }},
                { "range" : {
                    "usertag.logcreatetime" : {
                      "gte": "2017-01-12",
                      "lte": "2017-01-19"
                    }
                }}
              ]
            }
          }
        }
      }]
    }
  }
}'

语法的局限性在于,您可以查找特定的子项,其中特定tag及其logcreatetime位于给定范围内。但为了确保您有两个孩子,您应该将两个嵌套查询合并到顶级bool的2个必须子句中。