我们有两个索引:帖子和用户。我们想对这两个索引进行查询,在索引“ 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可以做到吗?
答案 0 :(得分:1)
我不相信可以完全按照您的要求进行操作,因为跨两个可能在不同节点上分片的索引进行连接会非常昂贵(这不是Elasticsearch的主要用例)。但是,如果您可以在弹性搜索中控制数据,则可以对数据进行结构化,以便实现其他类型的联接。
您可以使用:
文档可能包含嵌套类型的字段。这些字段用于为对象数组建立索引,其中每个对象都可以作为独立文档进行查询(使用嵌套查询)。
在单个索引内的文档之间可以存在联接字段关系。 has_child查询返回其子文档与指定查询匹配的父文档,而has_parent查询返回其父文档与指定查询匹配的子文档。
非正规化
或者,当您将文档插入索引后,可以将非规范化的用户存储在后文档中。这成为一种平衡行为,既节省了每次查看帖子(完全规范化)后进行多次读取所花费的时间,又节省了每次用户更改(取消规范化)用户007中所有帖子的更新成本。这里需要权衡取舍,您无需对所有内容都进行规范化处理,而您已经拥有了将用户名从用户规范化为帖子的规范化功能。
这里是Question/Answer,提供了更多有关选项的详细信息。