join - 如何在 Elasticsearch 中进行连接——或在 Lucene 级别

标签 join lucene nosql elasticsearch bigdata

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

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

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

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

这样对吗? 在 Elasticsearch 中有解决此查询的好方法吗?

最佳答案

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

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

this article 中所述不过,elasticsearch 帮助您管理关系这一事实并不意味着您必须使用这些功能。在很多复杂的用例中,最好在处理关系的应用层上有一些自定义逻辑。在方面,父/子也有限制:例如,您永远不能同时取回父和子,这与不允许仅取回匹配的子(目前)的嵌套文档相反。

关于join - 如何在 Elasticsearch 中进行连接——或在 Lucene 级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19524065/

相关文章:

php - MySQL 加入帮助

apache - 如何修复 java IOException : Can't find resource 'solrconfig.xml' in classpath?

java - 无法构建 nosqlunit-mongodb 项目

javascript - go - 在 Go 中合并 RethinkDB

mysql - 如何在规范化数据库中加入 tag_map

MySql 连接类型怪异(使用 "ALL"而不是 "eq_ref")

mysql - 在子查询中计算选票或使用连接 - 哪个更快?

java - 如何找到主要的 Lucene 源代码

lucene - .NET 版本的elasticsearch?

MongoDB:如何获取子文档字段值的不同列表?