如何为我的应用设计我的弹性指数?
How to design my elastic index for my application?
我的应用程序是一个调查创建应用程序,用户可以在其中创建包含许多不同类型问题的调查。然后可以将每个调查共享给任意数量的人,他们的回答记录如下...
{
"id" : 256, // submission id
"timeTaken" : "39.00",
"startTime" : "2020-07-19T05:37:38.873Z",
"state" : "COMPLETED",
"completedTime" : "2020-07-19T05:38:17.873Z",
"deviceType" : "COMPUTER",
"ip" : null,
"account_id" : 2,
"channel_id" : 48,
"contact_id" : null,
"survey_id" : 10,
"trigger_id" : 93,
"trigger_contact_id" : null,
"locked" : false,
"location" : null,
"language" : null,
"submission_id" : 256,
"question_90" : {
"skipped" : false,
"answer_choices" : [ 79 ]
},
"question_122" : {
"skipped" : false,
"otherChoice" : null,
"answer_choices" : [ 115, 113, 111, 110, 114 ]
},
"question_106" : {
"skipped" : false,
"answer_choices" : [
85
]
},
"question_120" : {
"answer_txt": "Great service",
"skipped" : false
},
"question_118" : {
"answer_txt": "Hello people",
"skipped" : false
},
"question_121" : {
"skipped" : false,
"answer_date" : "2020-06-04T20:01:49.783Z",
"answer_timezone" : 330
},
"question_108" : {
"skipped" : false,
"answer_int" : "93"
},
"question_105" : {
"skipped" : false,
"answer_string" : "+1 202 9932219"
},
"question_93" : {
"skipped" : false,
"answer_string" : "Kyra60@yahoo.com"
},
"question_117" : {
"skipped" : false
},
"question_92" : {
"skipped" : false,
"answer_txt" : "composite"
},
"question_107" : {
"skipped" : false,
"answer_bool" : true
},
}
最初我为每个调查创建了一个索引,但事实证明这是一个坏主意,因为每个索引分配了 5 个分片,而且我的应用程序有近 2 万个用户创建的调查。亚马逊弹性服务崩溃并响应在我的 2 个节点中创建了 60k 分片..
在这种困境中,我不知道如何创建索引或对其进行有意义的分区以便在后期进行高效查询。
任何人都可以分享一些见解并问我更多问题,以便我可以更新问题以澄清问题吗?
看起来您使用的是 elasticsearch 版本 < 7.X where default number of primary shards were 5 which is changed to 1,原因之一是您的问题是有很多较小的分片,这会影响 Elasticsearch 的性能。
理想情况下,您应该为所有调查创建一个索引,并根据 time-range 或规模 roll-over 创建一个新索引。
您需要在单个索引中包含 survey_id
(调查的唯一标识),并且在查询索引时,在过滤器上下文中使用 survey_id
以获得更好的查询性能,因为 filter contexts are cached by default.
我的应用程序是一个调查创建应用程序,用户可以在其中创建包含许多不同类型问题的调查。然后可以将每个调查共享给任意数量的人,他们的回答记录如下...
{
"id" : 256, // submission id
"timeTaken" : "39.00",
"startTime" : "2020-07-19T05:37:38.873Z",
"state" : "COMPLETED",
"completedTime" : "2020-07-19T05:38:17.873Z",
"deviceType" : "COMPUTER",
"ip" : null,
"account_id" : 2,
"channel_id" : 48,
"contact_id" : null,
"survey_id" : 10,
"trigger_id" : 93,
"trigger_contact_id" : null,
"locked" : false,
"location" : null,
"language" : null,
"submission_id" : 256,
"question_90" : {
"skipped" : false,
"answer_choices" : [ 79 ]
},
"question_122" : {
"skipped" : false,
"otherChoice" : null,
"answer_choices" : [ 115, 113, 111, 110, 114 ]
},
"question_106" : {
"skipped" : false,
"answer_choices" : [
85
]
},
"question_120" : {
"answer_txt": "Great service",
"skipped" : false
},
"question_118" : {
"answer_txt": "Hello people",
"skipped" : false
},
"question_121" : {
"skipped" : false,
"answer_date" : "2020-06-04T20:01:49.783Z",
"answer_timezone" : 330
},
"question_108" : {
"skipped" : false,
"answer_int" : "93"
},
"question_105" : {
"skipped" : false,
"answer_string" : "+1 202 9932219"
},
"question_93" : {
"skipped" : false,
"answer_string" : "Kyra60@yahoo.com"
},
"question_117" : {
"skipped" : false
},
"question_92" : {
"skipped" : false,
"answer_txt" : "composite"
},
"question_107" : {
"skipped" : false,
"answer_bool" : true
},
}
最初我为每个调查创建了一个索引,但事实证明这是一个坏主意,因为每个索引分配了 5 个分片,而且我的应用程序有近 2 万个用户创建的调查。亚马逊弹性服务崩溃并响应在我的 2 个节点中创建了 60k 分片..
在这种困境中,我不知道如何创建索引或对其进行有意义的分区以便在后期进行高效查询。
任何人都可以分享一些见解并问我更多问题,以便我可以更新问题以澄清问题吗?
看起来您使用的是 elasticsearch 版本 < 7.X where default number of primary shards were 5 which is changed to 1,原因之一是您的问题是有很多较小的分片,这会影响 Elasticsearch 的性能。
理想情况下,您应该为所有调查创建一个索引,并根据 time-range 或规模 roll-over 创建一个新索引。
您需要在单个索引中包含 survey_id
(调查的唯一标识),并且在查询索引时,在过滤器上下文中使用 survey_id
以获得更好的查询性能,因为 filter contexts are cached by default.