我有这个示例文档列表:
curl -XPOST 'localhost:9200/test_data/test_row/_bulk?pretty' -H 'Content-Type: application/json' -d'
{ "index": {}}
{ "value": 1, "user_id": 1, "profiler_id": 1}
{ "index": {}}
{ "value": 3, "user_id": 1, "profiler_id": 1}
{ "index": {}}
{ "value": 3, "user_id": 1, "profiler_id": 2}
{ "index": {}}
{ "value": 1, "user_id": 2, "profiler_id": 1}
{ "index": {}}
{ "value": 1, "user_id": 2, "profiler_id": 2}
{ "index": {}}
{ "value": 1, "user_id": 3, "profiler_id": 1}
{ "index": {}}
{ "value": 2, "user_id": 3, "profiler_id": 2}
{ "index": {}}
{ "value": 3, "user_id": 3, "profiler_id": 2}
{ "index": {}}
{ "value": 2, "user_id": 4, "profiler_id": 1}
{ "index": {}}
{ "value": 1, "user_id": 4, "profiler_id": 2}
{ "index": {}}
{ "value": 3, "user_id": 4, "profiler_id": 2}
'
我想计算所有回答了profiler_id = 1和value = 1 AND profiler_id = 2且值为1或2的用户。这意味着只有用户2和3符合两者的标准。
我知道如何对条款进行存储桶聚合并根据profiler_id对匹配文档进行计数,但是Elasticsearch中是否有办法计算一次匹配BOTH条件的用户?
{
"query": {
"bool": {
"must": [],
"must_not": [],
"should": [
{
"bool": {
"must": [
{
"term": {
"profiler_id": 1
}
},
{
"term": {
"value": 1
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"profiler_id": 2
}
},
{
"terms": {
"value": [
1,
2
]
}
}
]
}
}
]
}
},
"size": 0,
"aggs": {
"genres": {
"terms": {
"field": "profiler_id"
},
"aggs": {
"type_count": {
"cardinality": {
"field": "user_id"
}
}
}
}
}
}
根据profiler_id
分别给我计数,这不是我想要的。我不确定如何计算在两个存储桶中都有文档相交的用户。
答案 0 :(得分:0)
您是否尝试计算符合这些条件的唯一用户数?如果是这样,您只需将should
条款移至must
参数(强制转换为AND)并在user_id
字段上使用基数聚合
如果没有,你能举例说明你想要的输出吗?
答案 1 :(得分:0)
我寻找的解决方案需要索引用户对象,然后将其分析器索引为子文档。这样我就可以编写以下示例查询来获得我想要的结果:
{
"query": {
"bool": {
"must": [
{
"term": {
"country": "US"
}
},
{
"term": {
"gender": "m"
}
},
{
"range": {
"date": {
"gte": "2017-10-01"
}
}
},
{
"range": {
"date_of_birth": {
"gte": "1987-11-09",
"lte": "1999-11-09"
}
}
},
{
"has_child": {
"type": "user_profiler",
"query": {
"bool": {
"must": [
{
"bool": {
"must": [
{
"term": {
"profiler_id": 6
}
},
{
"terms": {
"answer_value": [
3,4,5
]
}
}
]
}
}
],
"must_not": [],
"should": []
}
}
}
},
{
"has_child": {
"type": "user_profiler",
"query": {
"bool": {
"must": [
{
"bool": {
"must": [
{
"term": {
"profiler_id": 3
}
},
{
"terms": {
"answer": [
1
]
}
}
]
}
}
],
"must_not": [],
"should": []
}
}
}
}
],
"must_not": [],
"should": []
}
}