Эластичный поиск, несколько индексов по сравнению с одним индексом и типами для разных наборов данных?
У меня есть приложение, разработанное с использованием шаблона MVC, и я хотел бы проиндексировать теперь несколько его моделей, это означает, что каждая модель имеет другую структуру данных.
-
Лучше ли использовать mutliple indexes, по одному для каждой модели, или иметь тип внутри одного индекса для каждой модели? Оба способа также потребуют другого поискового запроса, который я думаю. Я только начал с этого.
-
Существуют ли различия между обеими концепциями, если набор данных мал или огромен?
Я сам испытал бы второй вопрос, если кто-то может порекомендовать мне некоторые хорошие данные образца для этой цели.
Ответы
Ответ 1
Существуют разные последствия для обоих подходов.
Предполагая, что вы используете настройки по умолчанию Elasticsearch, с 1 индексом для каждой модели значительно увеличится количество ваших осколков, поскольку 1 индекс будет использовать 5 осколков, 5 моделей данных будут использовать 25 осколков; в то время как 5 типов объектов в 1 индексе все еще будут использовать 5 осколков.
Последствия для каждой модели данных в качестве индекса:
- Эффективный и быстрый поиск по индексу, поскольку количество данных должно быть меньше в каждом осколке, поскольку оно распределено по разным индексам.
- Поиск комбинации моделей данных из 2 или более индексов будет создавать накладные расходы, потому что запрос должен быть отправлен на большее количество чередов по индексам, скомпилирован и отправлен обратно пользователю.
- Не рекомендуется, если ваш набор данных невелик, так как вы будете нести больше памяти при создании каждого дополнительного осколка, а усиление производительности будет незначительным.
- Рекомендуется, если ваш набор данных большой, и ваши запросы занимают много времени для обработки, поскольку выделенные осколки хранят ваши конкретные данные, и процесс Elasticsearch будет проще обрабатывать.
Последствия для каждой модели данных как типа объекта в индексе:
- Больше данных будет храниться в пределах 5 обрывов индекса, что означает, что при запросе различных моделей данных возникают меньшие служебные проблемы, но размер вашего осколка будет значительно больше.
- Для поиска результатов поиска в Elicsearch потребуется больше времени, так как есть больше документов для фильтрации.
- Не рекомендуется, если вы знаете, что вы просматриваете 1 терабайт данных, и вы не распространяете свои данные по разным индексам или множественным осколкам в вашем сопоставлении Elasticsearch.
- Рекомендуется для небольших наборов данных, потому что вы не будете тратить пространство на хранение для предельного прироста производительности, поскольку каждый осколок занимает место в вашем оборудовании.
Если вы спрашиваете, что такое слишком большое количество данных или небольшие данные? Как правило, это зависит от скорости процессора и ОЗУ вашего оборудования, количества данных, которые вы храните в каждой переменной, в вашем сопоставлении для Elasticsearch и ваших запросов; использование многих аспектов в ваших запросах значительно замедлит ваше время ответа. Прямого ответа на этот вопрос нет, и вам придется ориентироваться в соответствии с вашими потребностями.
Ответ 2
Хотя ответ Джонатана был правильным в то время, мир перешел, и теперь кажется, что люди, стоящие за ElasticSearch, имеют долгосрочный план отказаться от поддержки нескольких типов:
Где мы хотим перейти: Мы хотим удалить концепцию типов из Elasticsearch, сохраняя при этом поддержку родителя/ребенка.
Итак, для новых проектов использование только одного типа для индекса сделает возможное обновление до ElasticSearch 6.x проще.
Ответ 3
Ответ Джонатана велик. Я бы просто добавил несколько других моментов, чтобы рассмотреть:
- количество настроек может быть настроено для каждого выбранного вами решения. У вас может быть один индекс с 15 основными осколками или разделить его на 3 индекса для 5 осколков - перспектива производительности не изменится (при условии, что данные распределены одинаково)
- подумайте об использовании данных. То есть. если вы используете кибану для визуализации, проще включать/исключать определенные индексы, но типы должны быть отфильтрованы на панели управления
- сохранение данных: для журналов/метрических данных приложения используйте разные индексы, если вам нужен другой период хранения
Ответ 4
Оба вышеупомянутых ответа велики!
Я добавляю пример нескольких типов в индекс.
Предположим, вы разрабатываете приложение для поиска книг в библиотеке.
Есть несколько вопросов, которые нужно задать владельцу библиотеки,
Вопросы:
-
Сколько книг вы планируете хранить?
-
Какие книги вы собираетесь хранить в библиотеке?
-
Как вы собираетесь искать книги?
Ответы:
-
Я планирую хранить книги от 50 k до 70 k (приблизительно)
-
У меня будет 15 k -20 k связанных с технологией книг (информатика, машиностроение, химическая инженерия и т.д.), 15 k исторических книг, 10 k медицинских книг. 10 k книг, связанных с языком (английский, испанский и т.д.)
-
Поиск по авторам имя, фамилия автора, год публикации, название издателя. (Это дает вам представление о том, какую информацию следует хранить в индексе)
Из приведенных выше ответов мы можем сказать, что схема в нашем индексе должна выглядеть примерно так.
//Это не точное отображение, просто для примера
"yearOfPublish":{
"type": "integer"
},
"author":{
"type": "object",
"properties": {
"firstName":{
"type": "string"
},
"lastName":{
"type": "string"
}
}
},
"publisherName":{
"type": "string"
}
}
Для достижения вышеуказанного мы можем создать один индекс под названием Books и иметь различные типы.
Указатель: Книга
Типы: Наука, Искусство
(Или вы можете создавать множество типов, таких как технология, медицинская наука, история, язык, если у вас есть много книг)
Важно отметить, что схема аналогична, но данные не идентичны. И еще одна важная вещь - общие данные, которые вы храните.
Надеемся, что вышеописанное поможет, когда идти по разным типам в Индексе, если у вас есть другая схема, вы должны рассмотреть другой индекс. Небольшой индекс для меньших данных. большой индекс для больших данных: -)