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

时间:2018-12-12 16:09:43

标签: node.js elasticsearch

我们有两个索引:帖子和用户。我们想对这两个索引进行查询,在索引“ 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 :(得分:1)

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

您可以使用:

nested query

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

has_childhas_parent queries

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

非正规化

或者,当您将文档插入索引后,可以将非规范化的用户存储在后文档中。这成为一种平衡行为,既节省了每次查看帖子(完全规范化)后进行多次读取所花费的时间,又节省了每次用户更改(取消规范化)用户007中所有帖子的更新成本。这里需要权衡取舍,您无需对所有内容都进行规范化处理,而您已经拥有了将用户名从用户规范化为帖子的规范化功能。

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