ES7 - как моделировать 1-n родительско-дочерние отношения - разные типы ES

Я переношу старый экземпляр ES на ES7. Нам нужно 1-n родительско-дочерних отношений.

Раньше у нас было несколько типов в одном индексе, и это было легко. Некоторые типы были связаны со своими родителями через _parent.

Но ES7 допускает только однотипные индексы. Это заставляет меня думать, что я конвертирую старые типы в отдельные индексы.

Я прочитал документы, и они предлагают использовать join для родительско-дочерних отношений, однако они, похоже, применимы только к документам, принадлежащим к одному индексу.

https://www.elastic.co/blog/removal-of-mapping-types-elasticsearch

Поэтому, если я конвертирую свои предыдущие типы в отдельные индексы, в моем понимании join не поможет.

Итак, каково правильное решение для моделирования родительско-дочерних отношений между различными типами (или, лучше сказать, индексами) в ES7?

Или, может быть, мне не следует моделировать свои данные как отдельные типы / индексы в ES7. Но в таком случае, как это решить?

заранее спасибо


person kcris    schedule 11.06.2020    source источник


Ответы (1)


Да, правильно использовать indices вместо types, поскольку ES устарел, что в версии 7, поэтому мы должны создать несколько индексов для управления этим вариантом использования.

Итак, теперь у нас есть только два варианта:

Вариант 1. Денормализуйте данные и загрузите документы соответствующим образом.

И здесь вы снова можете управлять этим двумя способами:

  • Значительно денормализуйте, продолжая использовать поле соединения или, скажем, денормализуйте 1-to-n child types в n indexes of to 1-to-1 parent-child type. По сути, у вас будет столько же индексов, сколько отношений родитель-потомок у вас было в более ранней версии, однако родительский элемент будет одинаковым для всех индексов. Нет индексов = Нет родительско-дочерних отношений

  • Второй способ добиться этого - полностью денормализовать данные таким образом, чтобы у вас был единый индекс со всей информацией обо всех дочерних элементах всех типов, которые у вас были, в одном документе. В этом случае no of index = 1

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

Недостатками в этом случае будут

  • Управление уровнем приема или заданиями
  • Сложность в поддержании структуры индекса
  • Проблемы с производительностью согласно этой ссылке при использовании типа соединения
  • Следите за будущими версиями ES, если они решат изменить родительско-дочернюю функцию, хотя пока это не рассматривается.

Преимущества:

  • Вероятно, на уровне обслуживания, который не имеет отношения к Варианту 2, как описано ниже.
  • Возможность сопоставлять варианты использования, которые могут возникнуть при использовании интерфейсного приложения.

Варианты 2: Управление объединением на уровне приложения

  • Иметь один родительский индекс и несколько дочерних индексов, но управлять объединением на уровне приложения. Если у вас несколько 1-to-n mapping, то количество индексов будет n (parent = 1, child = n-1)

Недостатки:

  • Может быть, а может быть, не удастся легко связать с вариантами использования
  • Написание отдельной логики соединения на уровне приложения. Не говоря уже о том, что если вы хотите выполнить агрегацию между родительским и дочерним элементами, вам придется написать несколько циклов for с несколькими отдельными запросами агрегации.

Преимущества:

  • Простота поддержки заданий или уровня приема
  • Управление индексами было бы менее болезненным

В качестве альтернативы вы можете смешивать и сочетать оба вышеуказанных варианта, в зависимости от ваших сценариев использования.

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

Лучший способ - продолжить с некоторыми фиктивными данными, провести некоторое тестирование производительности и посмотреть, какие факторы вы бы использовали, простота запросов, обслуживание индекса, производительности запросов или агрегирования, простота разработки / управления как заданиями приема, так и уровнем обслуживания и т. Д. .

Возможно, это не совсем то, что вы ищете, но я просто надеюсь, что это поможет!

person Opster ES Ninja - Kamal    schedule 11.06.2020