Elasticsearch js с Node.js: как вернуть агрегированные результаты из нескольких индексов? - PullRequest
0 голосов
/ 12 декабря 2018

У нас есть два индекса: посты и пользователи.Мы хотели бы сделать запросы по этим двум индексам, выполнить поиск сообщения в индексе «posts», а затем перейти к индексу «users», чтобы получить информацию о пользователе, чтобы в конечном итоге вернуть совокупный результат как информации о пользователе, так исообщение, которое мы нашли.

Позвольте мне немного пояснить это на примере:

posts: 
[
  {
    post: "this is a post about stack overflow",
    username: "james_bond",
    user_id: "007"
  },
  {...}
]

users: 
[
  {
    username: "james_bond",
    user_id: "007",
    bio: "My name's James. James Bond."
    nb_posts: "7"
  },
  {...}
]

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

result: {
  username: "james_bond",
  user_id: "007",
  post: "this is a post about stack overflow",
  bio: "My name's James. James Bond"
}

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

Так можно ли это сделать только с ES js?

1 Ответ

0 голосов
/ 21 декабря 2018

Я не верю, что можно сделать именно то, что вы просите, поскольку объединение двух индексов, которые потенциально могут быть разнесены по разным узлам, будет очень дорогостоящим (это не основной сценарий использования эластичного поиска).Но если у вас есть контроль над данными в рамках упругого поиска, вы можете структурировать данные так, чтобы вы могли получить другой тип объединения.

Вы можете использовать:

вложенный запрос

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

has_child и has_parent запросов

Между документами в пределах одного индекса может существовать связь полей объединения.Запрос has_child возвращает родительские документы, чьи дочерние документы соответствуют указанному запросу, в то время как запрос has_parent возвращает дочерние документы, родительский документ которых соответствует указанному запросу.

Денормализация

В качестве альтернативы вы можете сохранить денормализованный пользователь в почтовом документе при вставке документа в индекс.Это становится балансом между экономией времени от выполнения нескольких операций чтения каждый раз, когда сообщение просматривается (полностью нормализовано), и стоимостью обновления всех сообщений от пользователя 007 каждый раз, когда его изменения изменяются (денормализовано).Здесь есть компромисс, вам не нужно денормализовать все, и, поскольку у вас это есть, вы уже денормализовали имя пользователя от пользователей к сообщениям.

Вот Вопрос / Ответ , который дает больше деалитовпо опциям.

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