Как хранить вложенные реляционные данные в Solr - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь хранить данные в Solr, чтобы лучше поддерживать индексы. У меня проблема в том, что моя структура данных сильно вложена. Пример:

Company
  (to many) Person
    (to many) Property
      (to many) Network
        (to many) SubNetwork

Я пытаюсь создать индекс полнотекстового поиска для каждого SubNetwork, который будет отображать текущие родительские поля вдоль него.

В настоящее время мои данные полностью денормализованы, например:

{
    "company": "Coca-Cola",
    "property": "1 plaza hotel",
    "network": "ABC",
    "subNetwork": "123"
}

Теперь, если пользователь зайдет в приложение и изменит название компании, прямо сейчас (в денормализованном состоянии), это потребует от Solr частичного обновления (атомарного обновления) многих документов, которые не кажутся очень эффективными. , Повторная индексация индекса не является предпочтительным решением, поскольку это мультитенантное приложение.

Я попытался поместить реляционные данные в отдельные индексы, а затем использовал join в Solr, но это не копирует объединенные поля индексов в конечном результате, что означает, что полнотекстовый поиск по всем полям невозможен.

{!join from=inner_id to=outer_id}field:value

Я пытаюсь настроить Solr таким образом, чтобы при обновлении родительской записи требовалось только одно атомарное обновление, но при этом сохранялась возможность поиска по всем полям. Это возможно?

1 Ответ

0 голосов
/ 11 июня 2019

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

Выполнение атомарного обновления под обложками фактически все равно переиндексирует документ (и создает новый документ уровня Lucene).Это также требует, чтобы все поля были сохранены, чтобы позволить воссоздать документ.И объединение уменьшает гибкость, которую вы можете иметь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...