9

在 Elasticsearch 中执行相当于 SQL 连接的最佳方法是什么?

我有一个带有两个大表的 SQL 设置:Persons 和 Items。一个人可以拥有许多物品。Person 和 Item 行都可以更改(即更新)。我必须运行搜索,根据人和项目的各个方面进行过滤。

在 Elasticsearch 中,看起来您可以将 Person 设置为 Item 的嵌套文档,然后使用has_child.

但是:如果你然后更新一个人,我认为你需要更新他们拥有的每个项目(可能很多)。

那是对的吗?有没有一种很好的方法可以在 Elasticsearch 中解决这个查询?

4

2 回答 2

15

如前所述,要走的路是父母/孩子。关键是嵌套文档的性能非常好,但为了更新它们,您需要重新提交整个结构(父文档 + 嵌套文档)。尽管嵌套文档的内部实现由单独的 lucene 文档组成,但那些嵌套文档是不可见的,也不能直接访问。事实上,当使用嵌套文档时,您需要使用适当的查询来访问它们(嵌套查询、嵌套过滤器、嵌套方面等)。

另一方面,父/子允许您拥有相互引用的单独文档,这些文档可以独立更新。它在性能和内存使用方面是有代价的,但它比嵌套文档更灵活。

不过,正如本文中提到的,elasticsearch 可以帮助您管理关系这一事实并不意味着您必须使用这些功能。在许多复杂的用例中,在处理关系的应用程序层上有一些自定义逻辑会更好。在方面,父母/孩子也有限制:例如,您永远不能同时取回父母和孩子,而嵌套文档不允许只取回匹配的孩子(目前)。

于 2013-10-23T08:23:31.040 回答
3

看看我的答案:在 Elasticsearch 中,多个顶级文档可以共享一个嵌套文档吗?

这讨论了使用_parent映射来避免在更新 Person 时需要更新每个 Item 的问题。

于 2013-10-22T22:49:28.290 回答