我们有两个索引:帖子和用户。我们想对这两个索引进行查询,在索引“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_child和has_parent queries
单个索引内的文档之间可以存在联接字段关系。 has_child查询返回其子文档与指定查询匹配的父文档,而has_parent查询返回其父文档与指定查询匹配的子文档。
非规范化
另外,当您将文档插入索引后,可以将非规范化的用户存储在后文档中。这成为一种平衡行为,既节省了每次查看帖子(完全规范化)后进行多次读取的时间,又节省了每次用户更改(取消规范化)用户007中所有帖子的更新成本。这里需要权衡取舍,您不需要对所有内容都进行规范化处理,并且您已经将用户名从用户规范化为帖子。
这是Question/Answer,提供了更多有关选项的详细信息。
关于node.js - 带有Node.js的Elasticsearch js:如何从多个索引返回聚合结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53747030/