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

标签 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就能做到吗?

最佳答案

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

您可以使用:

nested query

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

has_childhas_parent queries

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

非规范化

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

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

关于node.js - 带有Node.js的Elasticsearch js:如何从多个索引返回聚合结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53747030/

相关文章:

javascript - 对 SQL 查询进行排队

javascript - Mongoose 从多个对象中提取嵌套数组到一个数组中

node.js - Azure 中的 Angular 应用程序显示原始 js 文本

elasticsearch - 如何防止Elasticsearch中索引的意外写入和数据删除?

node.js - Docker-compose使2个微服务(前端+后端)通过http请求相互通信

node.js - 在 firestore 中,连接用户调用云函数从云 firestore 获取数据的更好方法是什么?

elasticsearch - Elasticsearch Soundex匹配查询-NEST

python - 如何使用python在Elasticsearch索引中存储键值对

elasticsearch - Elasticsearch:翻转后的父子关系

elasticsearch - analyzed v not_analyzed 还是...?