elasticsearch由多个字段聚合

时间:2016-05-11 07:49:06

标签: elasticsearch aggregation

我是ElasticSearch的新手,它看起来很棒,但我仍然需要一些范式改变才能完全理解如何使用它。

我的项目是一个带仪表板的调查平台。 一项调查有多个"屏幕" (问题),每个屏幕都有多个可能的答案 - 用户选择一个答案,当他完成调查时,他会提交答案。

我们说我的文档看起来像这样(代表用户所做的调查):

{
    "survey_station_id": "199",
    "survey_id": "905",
    "survey_unique_identifier": "2016-05-11 08:45:34-e4c080d90264e47a1fdb2d021ca52d3a",
    "current_timestamp": 1462949134,
    "survey_timestamp": "1462949115",
    "answers": [{
        "screen_id": "9429",
        "answer_id": "4"
    }, {
        "screen_id": "9428",
        "answer_id": "3"
    }, {
        "screen_id": "9431",
        "answer_id": "0",
        "answer_text": "Very good"
    }, {
        "screen_id": "10819",
        "answer_id": "10742"
    }, {
        "screen_id": "10820",
        "answer_id": "0",
        "answer_text": "dan@somewhere.com"
    }, {
        "screen_id": "10821",
        "answer_id": "9"
    }, {
        "screen_id": "10822",
        "answer_id": "5"
    }, {
        "screen_id": "10823",
        "answer_id": "10745"
    }]
}

我的数据库(或索引)中有大量这样的文档。

在我的信息中心中,我希望按屏幕显示细分并计算每个答案的数量,这些信息会告诉我:

{
    screen_id: 9429,
    answers: [{
        answer_id: 1,
        doc_count: 150
    }, {
        answer_id: 2,
        doc_count: 23
    }],
    screen_id: 9428,
    answers: [{
        answer_id: 1,
        doc_count: 78
    }, {
        answer_id: 2,
        doc_count: 96
    }]
}

我怎样才能达到或类似?我的文档结构是否可行且容易,或者我应该对其进行一些操作以提高此类要求的效率?

提前致谢

1 个答案:

答案 0 :(得分:0)

请注意,Kibana(目前)不支持嵌套文档,但如果您要构建自己的仪表板,那么我更喜欢嵌套解决方案以完全“平坦”。例如,它可以更容易地计算仅根文档的统计信息,并在必要时忽略屏幕。

一旦您将子文档编入索引为“嵌套”,您需要在聚合查询中包含这些元素:

  1. Nested aggregation
  2. Terms aggregation screen_id
  3. answer_id
  4. 上的其他字词汇总

    请务必为术语聚合设置一些合理的限制,否则您可能会遇到combinatorial explosion。另请注意,如果您只对某些屏幕感兴趣,则可以在术语聚合上使用“包含”和“排除”规则。实际上我想你会希望在survey_id上有一个过滤器,因为在不同的调查中汇总结果是没有意义的(除非screen_id是唯一的)。