在Elasticsearch中,假设我有两个索引my_users
和user_actions
。此外,假设我的一些用户有一个字段vipID
。我想计算具有(非空)climb
字段的用户执行的vipID
类型的用户操作数。
一方面,我知道如何过滤具有vipID
字段的用户:
curl localhost:8080/my_users/_search
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"exists": {
"field": "vipID"
}
}
}
}
}
另一方面,我知道如何找到用户1和2执行的所有爬升操作(即userID
字段等于1
或2
:< / p>
curl localhost:8080/users_actions/climb/_search
{
"query": {
"constant_score": {
"filter": {
"terms": {
"adUserId": [
"1",
"2"
]
}
},
"boost": 1.2
}
}
}
我不知道如何做到这两点?如何从第一个查询中插入asUserId
的第二个查询。
以上仅是一个最小的例子。基于评论,我编写了任务脚本。但是,在实际情况中,我有数千名用户,我从Argument list too long
收到curl
错误。
答案 0 :(得分:0)
在my_users
的映射中,将user_actions
指定为子文档。使用userID
作为parentID
对其进行索引。然后,您可以查询父级,并使用has_child
过滤器过滤结果。像这样:
curl localhost:8080/my_users/_search
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"and": [
{
"exists": {
"field": "vipID"
}
},
{
"has_child": {
"type": "user_actions",
"query": {
"constant_score": {
"filter": {
"terms": {
"adUserId": [
"1",
"2"
]
}
},
"boost": 1.2
}
}
}
}
]
}
}
}
}