Мое эмпирическое правило - если вам нужно запрашивать / обновлять вложенные поля, используйте плоскую структуру.
Если вы используете вложенную структуру, то упругость сделает ее плоской, но затем накладные расходы на управление этими отношениями. С точки зрения производительности - плоская конструкция всегда лучше, так как программе эластичности не нужно связывать и находить вложенные документы.
Elasticsearch все еще принципиально плоский, но он управляет вложенными отношениями внутри, чтобы создать видимость вложенной иерархии. Когда вы создаете вложенный документ, Elasticsearch фактически индексирует два отдельных документа (корневой объект и вложенный объект), а затем связывает их внутренне. Оба документа хранятся в одном и том же блоке Lucene на одном и том же шарде, поэтому производительность чтения все еще очень высока.
Такое расположение имеет некоторые недостатки. Наиболее очевидно, что вы можете получить доступ к этим вложенным документам только с помощью специального nested
query
. Другой большой недостаток возникает, когда вам необходимо обновить документ, либо корневой, либо любой из объектов.
Поскольку все документы хранятся в одном блоке Lucene, а Lucene никогда не разрешает произвольный доступ для записи в его сегменты,Обновление одного поля во вложенном документе приведет к переиндексации всего документа.
Это включает в себя корневой и любые другие вложенные объекты, даже если они не были изменены. Внутренне ES пометит старый документ как удаленный, обновит поле и затем переиндексирует все в новый блок Lucene. Если ваши данные часто изменяются, вложенные документы могут иметь незначительные накладные расходы, связанные с переиндексацией.
Наконец, невозможно «перекрестно ссылаться» между вложенными документами. Один вложенный документ не может "видеть" свойства другого вложенного документа. Например, вы не можете фильтровать по «A.name», но фасетировать по «B.age». Вы можете обойти это, используя include_in_root
, который эффективно копирует вложенные документы в корень, но это возвращает вас к проблемам внутренних объектов.