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

问个 es 查询的问题

  •  
  •   assert · 2017-09-21 18:53:11 +08:00 · 2456 次点击
    这是一个创建于 2625 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在 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
    badttt
        1
    badttt  
       2017-09-21 19:06:15 +08:00
    目测 query 写错了。你的 age 数据类型是 text 吧?
    badttt
        2
    badttt  
       2017-09-21 19:08:54 +08:00
    如果是 text 只能这样写
    "query": {
    "bool": {
    "must": [
    {
    "term": {
    "family.age.keyword": "45"
    }
    }
    ]
    }
    }
    oaix
        3
    oaix  
       2017-09-22 10:35:52 +08:00
    由于你的文档是一个个 family, 所以匹配条件匹配到的并不是 45 岁的人, 而是包含 45 岁的人的 family, 再对这些家庭做聚合, 自然会包含其他年龄的 bucket.

    有两个方法:
    1. 按照目前的聚合方法, terms 聚合的 size 大一点, 程序选择 45 岁的 bucket.
    2. 把每个人单独索引(可以利用 nested 类型), 查询那个索引.
    assert
        4
    assert  
    OP
       2017-09-23 13:11:28 +08:00
    @oaix 统计的时候同时还要统计 relationship 其他字段
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3056 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:49 · PVG 22:49 · LAX 06:49 · JFK 09:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.