问个 es 查询的问题

2017-09-21 18:53:11 +08:00
 assert
现在 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
}
2306 次点击
所在节点    Java
4 条回复
badttt
2017-09-21 19:06:15 +08:00
目测 query 写错了。你的 age 数据类型是 text 吧?
badttt
2017-09-21 19:08:54 +08:00
如果是 text 只能这样写
"query": {
"bool": {
"must": [
{
"term": {
"family.age.keyword": "45"
}
}
]
}
}
oaix
2017-09-22 10:35:52 +08:00
由于你的文档是一个个 family, 所以匹配条件匹配到的并不是 45 岁的人, 而是包含 45 岁的人的 family, 再对这些家庭做聚合, 自然会包含其他年龄的 bucket.

有两个方法:
1. 按照目前的聚合方法, terms 聚合的 size 大一点, 程序选择 45 岁的 bucket.
2. 把每个人单独索引(可以利用 nested 类型), 查询那个索引.
assert
2017-09-23 13:11:28 +08:00
@oaix 统计的时候同时还要统计 relationship 其他字段

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/392628

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX