【问题标题】:Elasticsearch js with Node.js: How to return aggregated results from multiple indexes?Elasticsearch js 与 Node.js:如何从多个索引返回聚合结果?
【发布时间】:2018-12-21 18:03:42
【问题描述】:

我们有两个索引:帖子和用户。我们想对这两个索引进行查询,在索引“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 可以做到吗?

【问题讨论】:

  • 我也有同样的好奇心。显然,我们可以从我们的应用程序对 ES 进行多个单独的查询,然后在我们的应用程序中管理结果。问题是 ES 是否有任何特定于这个用例的特性,这可能更有效。

标签: node.js elasticsearch


【解决方案1】:

我不相信可以完全按照您的要求进行操作,因为跨两个可能分片到不同节点的索引连接成本非常高(这不是 elasticsearch 的主要用例)。但是,如果您可以控制弹性搜索中的数据,则可以构建数据,以便实现不同类型的连接。

您可以使用:

nested query

文档可能包含嵌套类型的字段。这些字段用于索引对象数组,其中每个对象都可以作为独立文档进行查询(使用嵌套查询)。

has_childhas_parent queries

连接字段关系可以存在于单个索引中的文档之间。 has_child 查询返回其子文档与指定查询匹配的父文档,而 has_parent 查询返回其父文档与指定查询匹配的子文档。

非规范化

或者,当您将文档插入索引时,您可以将用户非规范化存储在发布文档中。这成为了在每次查看帖子时节省多次读取的时间(完全规范化)和每次用户 007 的详细信息更改(非规范化)更新所有帖子的成本之间的平衡行为。这里有一个权衡,您不需要对所有内容进行非规范化,并且您已经将用户名从用户非规范化到帖子。

这是一个Question/Answer,它提供了有关选项的更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-23
    • 2021-09-25
    • 2013-11-19
    • 2021-03-08
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多