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},
。你的问题就是这样吗?