我是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
}]
}
我怎样才能达到或类似?我的文档结构是否可行且容易,或者我应该对其进行一些操作以提高此类要求的效率?
提前致谢
答案 0 :(得分:0)
请注意,Kibana(目前)不支持嵌套文档,但如果您要构建自己的仪表板,那么我更喜欢嵌套解决方案以完全“平坦”。例如,它可以更容易地计算仅根文档的统计信息,并在必要时忽略屏幕。
一旦您将子文档编入索引为“嵌套”,您需要在聚合查询中包含这些元素:
screen_id
answer_id
请务必为术语聚合设置一些合理的限制,否则您可能会遇到combinatorial explosion。另请注意,如果您只对某些屏幕感兴趣,则可以在术语聚合上使用“包含”和“排除”规则。实际上我想你会希望在survey_id
上有一个过滤器,因为在不同的调查中汇总结果是没有意义的(除非screen_id
是唯一的)。