这是一个创建于 2588 天前的主题,其中的信息可能已经有所发展或是发生改变。
现在 es 里每个数据文档是这么存的
{
"name": "小明",
"age": "35",
"family": [
{
"name": "张三",
"relationship": "父子",
"age": "45"
},
{
"name": "李四",
"relationship": "儿子",
"age": "18"
}
]
}
我想统计 family 下 age 为 45 的有多少个改怎么做
{
"query": {
"query_string": {
"query": "family.age:45"
}
},
"aggs": {
"age": {
"terms": {
"field": "family.age",
"size": 5
}
}
}
}
这样统计出来的结果会把别的也显示出来,怎么让他只显示 age=45 的
{
"key": "45",
"doc_count": 56
},
{
"key": "18",
"doc_count": 22
},
{
"key": "35",
"doc_count": 10
},
{
"key": "21",
"doc_count": 5
},
{
"key": "15",
"doc_count": 1
}
4 条回复 • 2017-09-23 13:11:28 +08:00
|
|
1
badttt 2017-09-21 19:06:15 +08:00
目测 query 写错了。你的 age 数据类型是 text 吧?
|
|
|
2
badttt 2017-09-21 19:08:54 +08:00
如果是 text 只能这样写 "query": { "bool": { "must": [ { "term": { "family.age.keyword": "45" } } ] } }
|
|
|
3
oaix 2017-09-22 10:35:52 +08:00
由于你的文档是一个个 family, 所以匹配条件匹配到的并不是 45 岁的人, 而是包含 45 岁的人的 family, 再对这些家庭做聚合, 自然会包含其他年龄的 bucket.
有两个方法: 1. 按照目前的聚合方法, terms 聚合的 size 大一点, 程序选择 45 岁的 bucket. 2. 把每个人单独索引(可以利用 nested 类型), 查询那个索引.
|
|
|
4
assert 2017-09-23 13:11:28 +08:00
@ oaix 统计的时候同时还要统计 relationship 其他字段
|