Каковы плюсы и минусы использования вложенного сопоставления в Elasticsearch по сравнению с родительско-дочерними отношениями

В настоящее время в моей структуре документа ES есть поле типа «Объект». Это объект json, внутри которого может быть до 3000 полей. Проблема в том, что иногда моей ES не хватает памяти из-за слишком большого размера документа. Поэтому я хочу изменить структуру своего документа.

Две структуры, на которые я смотрю, - это вложенные сопоставления и родительские дочерние отношения. Обе структуры удовлетворяют моим требованиям к поиску. Учитываются пункты:

  1. Я читал, что вложенные запросы намного быстрее, чем дочерние запросы.
  2. Вложенные сопоставления также сохраняют вложенные поля как отдельные документы.

Две точки путаницы, с которыми я сталкиваюсь:

  1. Как работает вложенное индексирование? Получает ли ES весь документ за один раз и анализирует его сразу полностью, или запросы на вложенные документы индивидуальны. Потому что в первом случае может случиться так, что у ES снова закончится память.

  2. Когда мы говорим, что родительские дочерние запросы выполняются медленнее, насколько медленнее мы имеем в виду?

Ищем входы.


person Aayushi    schedule 20.09.2017    source источник


Ответы (2)


Вложенные быстрее, чем родительские/дочерние, и ими проще управлять. На самом деле вы можете индексировать ребенка без родителей, поэтому вы должны быть осторожны при индексировании. Также, если вы хотите удалить одну запись родителя, вы должны удалить все дочерние узлы, это не автоматическая задача. С другой стороны, родителю/ребенку будет удобнее, если вы измените/обновите свою запись. С вложенным типом вы не можете изменить только одно вложенное значение во вложенном поле, вы должны переиндексировать все вложенные значения во вложенном поле. С родительским/дочерним элементом вы также можете изменить/обновить только одно значение в этом родительском или дочернем поле. Вложенные рассматриваются как атомарные реляционные данные в индексе, вместо этого родительский/дочерний — это только другой тип данных, который сохраняет отношения из 2 полей — родительский, дочерний. Вы можете прочитать сообщение о кимчи здесь, а о медлительности родителя/ребенка вы можете прочитать последний комментарий обсуждения https://discuss.elastic.co/t/choosing-parent-child-vs-nested-document/6742

person Lupanoide    schedule 20.09.2017
comment
Спасибо за Ваш ответ. Но один из основных вопросов, которые у меня есть, заключается в том, анализирует ли ES во вложенной структуре при индексации весь документ (вместе с вложенными полями) сразу или по отдельности? - person Aayushi; 25.09.2017

Вложенный ::

  1. Вложенные документы хранятся в одном и том же блоке Lucene, что повышает производительность чтения/запроса. Чтение вложенного документа происходит быстрее, чем эквивалентного родителя/дочернего документа.

  2. Обновление одного поля во вложенном документе (родительском или вложенном дочернем) заставляет ES переиндексировать весь вложенный документ. Это может быть очень дорого для больших вложенных документов.

  3. Перекрестные ссылки на вложенные документы невозможны.

  4. Лучше всего подходит для данных, которые не меняются часто.

Родительский/дочерний элемент ::

  1. Потомки хранятся отдельно от родителя, но перенаправляются в тот же шард. Таким образом, родительские/дочерние элементы имеют немного меньшую производительность при чтении/запросе, чем вложенные.

  2. Сопоставления родитель/потомок требуют дополнительных затрат памяти, так как ES поддерживает список соединений в памяти.

  3. Обновление дочернего документа не влияет на родительский или любые другие дочерние документы, что потенциально может сэкономить много времени при индексировании больших документов.

  4. Сортировка/оценка может быть затруднена с использованием родительского/дочернего элементов, поскольку операции «Имеет дочерний элемент» и «Имеет родительский элемент» иногда могут быть непрозрачными.

person Abhijit Bashetti    schedule 07.05.2021