elasticsearch,Node.js,elasticsearch" /> elasticsearch,Node.js,elasticsearch" />

Elasticsearch js with Node.js:如何从多个索引返回聚合结果?

Elasticsearch js with Node.js:如何从多个索引返回聚合结果?,node.js,elasticsearch,Node.js,elasticsearch,我们有两个索引:post和users。我们想对这两个索引进行查询,在索引“posts”中搜索一篇文章,然后转到索引“users”获取用户信息,最终返回用户信息和我们找到的文章的聚合结果 让我用一个例子来澄清一下: posts: [ { post: "this is a post about stack overflow", username: "james_bond", user_id: "007" }, {...} ] users: [ {

我们有两个索引:post和users。我们想对这两个索引进行查询,在索引“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是否可以做到这一点呢?

我不认为可以完全按照您的要求来做,因为跨两个可能在不同节点上分片的索引进行连接会非常昂贵(这不是elasticsearch的主要使用案例)。但是,如果您可以在弹性搜索中控制数据,您可以对数据进行结构化,以便实现不同类型的连接

您可以使用:

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

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

非规范化

或者,在将文档插入索引时,可以将非规范化的用户存储在post文档中。这就成为了一个平衡点,既节省了每次发送一篇文章时进行多次读取的时间(完全标准化),又节省了每次用户007的详细信息发生变化时更新所有文章的成本(非标准化)。这里有一个折衷办法,你不需要去规范化所有的东西,因为你已经去规范化了从用户到帖子的用户名


下面是一个关于选项的详细说明。

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