首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

问个 es 查询的问题

  •  
  •   assert · 2017-09-21 18:53:11 +08:00 · 1178 次点击
    这是一个创建于 575 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在 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 其他字段
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2388 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 07:35 · PVG 15:35 · LAX 00:35 · JFK 03:35
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1