elasticsearch Elasticsearch 5.2多术语嵌套查询,elasticsearch,nested,elasticsearch,Nested" /> elasticsearch Elasticsearch 5.2多术语嵌套查询,elasticsearch,nested,elasticsearch,Nested" />

elasticsearch Elasticsearch 5.2多术语嵌套查询

elasticsearch Elasticsearch 5.2多术语嵌套查询,elasticsearch,nested,elasticsearch,Nested,嵌套文档如下所示 { "userid": "123", "usertag": [ { "tag": "A", "logcreatetime": "2017-01-14" }, { "tag": "C", "logcreatetime": "2017-01-17" } ] }, { "userid": "45

嵌套文档如下所示

{
    "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? 谢谢
对不起,我的英语不好。

我假设您已将
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

的两个必选项。谢谢您的回答,但很抱歉我没有说清楚。事实上,我的查询中有两个以上的标记。Es没有嵌套子查询吗?再次感谢!我认为不能将嵌套查询和子查询结合起来,因为它们使用两种不同的数据结构。但您可以尝试做的是分离关注点:将嵌套相关信息与子相关信息分开存储。你的场景就是这样吗?事实上,我需要一段时间和一些标签用户在一起。然后看看他们在这段时间内还有哪些其他标签。似乎很难用ES得出这个结论。我尝试过各种数据结构。最接近的是嵌套结构,但看起来还是一样。顺便问一下,父级上有多少字段?如果没有那么多的父字段,并且您没有太多的用例,那么您可以简单地对数据进行反规范化并使其扁平化,比如
[{userid:123,usertag:a,time:xxx},{userid:123,usertag:b,time:yyy},{userid:456,usertag:c,time:zzz},
。你的问题就是这样吗?