#elasticsearch #elastic-stack
#elasticsearch #elastic-stack
Вопрос:
Мое приложение представляет собой приложение для создания опросов, в котором пользователь может создавать опросы с множеством вопросов разных типов. Затем каждый опрос может быть передан любому количеству людей, чьи ответы записаны, как показано ниже … 1 ответ выглядит примерно так:
{
"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
},
}
Мне нужно все поле здесь для анализа и запросов.
Но в большинстве случаев ограничение поля документа превышает ограничение по умолчанию для elasticsearch, равное 1000.
Я почти уверен, что его производительность составляет 1000, но как я могу выполнить это и вставить документ, который может содержать более 20 тыс. полей.
Есть идеи по этому поводу?
Ответ №1:
Вы определенно не должны идти в направлении взрыва сопоставления. ключи хранятся в памяти, поэтому у вас будет чрезмерное потребление оперативной памяти и низкая производительность. У вас это задокументировано здесь: elastic.co/blog/found-crash-elasticsearch#mapping-explosion
Вы могли бы легко сопоставить свои ответы с очень небольшим количеством ключей, используя вложенный тип данных.
"answers": [
{
"question_id": 122,
"skipped" : false,
"otherChoice" : null,
"answer_choices" : [ 115, 113, 111, 110, 114 ]
}
]
Комментарии:
1. опять же, но огромные записи во вложенных файлах приведут к значительному снижению производительности.. Я думаю, ему нужно подумать о лучшем дизайне
2. любые рекомендации по дизайну или лучшее представление о том, как мне следует двигаться вперед 😔
3. @Jaycreation очень хороший документ
4. @ElasticsearchNinja Какие-либо рекомендации по дизайну или какие-либо моменты, которые могут помочь мне решить эту проблему?
5. 1) Полей 50 КБ, безусловно, все еще слишком много, но это сообщение в блоге от 2014 года, и с тех пор многое изменилось (разреженность больше не вызывает такой большой нагрузки на диск, больше структур данных вне кучи). 2) В зависимости от того, как вы хотите использовать эти поля, хорошим решением может быть новый тип сплющенного поля.