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



我们有两个索引:posts和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就可以做到这一点吗?

我认为不可能完全按照您的要求进行,因为在两个索引之间进行连接会非常昂贵,而这两个索引可能会在不同的节点之间进行分割(这不是弹性搜索的主要用例(。但是,如果你在弹性搜索中控制了数据,你可以对数据进行结构化,这样你就可以获得不同类型的连接。

您可以使用:

嵌套查询

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

has_child和has_parent查询

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

去标准化

或者,当您将文档插入索引时,您可以将未规范化的用户存储在post文档中。这就成为了一种平衡行为,既可以节省每次帖子被激活时进行多次读取的时间(完全规范化(,也可以节省每次用户007的细节发生变化时更新所有帖子的成本(非规范化(。这里有一个折衷方案,你不需要对所有内容进行非规范化,而且你已经将用户名从用户到帖子进行了非规范化。

这是一个问题/答案,提供了更多关于选项的详细信息。

最新更新