在Elasticsearch中进行等效于SQL连接的最佳方法是什么?
我有一个带有两个大表的SQL安装程序:Persons和Items。一个人可以拥有 许多 物品。人员和项目行都可以更改(即更新)。我必须运行按人员和项目方面进行筛选的搜索。
在Elasticsearch中,您似乎可以使Person成为Item的嵌套文档,然后使用has_child。
has_child
但是:如果您随后更新一个Person,我认为您需要更新他们拥有的每个Item(可能很多)。
那是对的吗?在Elasticsearch中有解决此查询的好方法吗?
正如已经提到的,要走的路是父母/孩子。关键是嵌套文档的性能非常好,但是要对其进行更新,您需要重新提交整个结构(父+嵌套文档)。尽管嵌套文档的内部实现由单独的Lucene文档组成,但是这些嵌套文档不可见,也不能直接访问。实际上,在使用嵌套文档时,您需要使用适当的查询来访问它们(嵌套查询,嵌套过滤器,嵌套构面等)。
另一方面,父/子允许您具有相互引用的单独文档,这些文档可以独立更新。就性能和使用的内存而言,它是有代价的,但是它比嵌套文档更加灵活。
但是,如本文所述,elasticsearch可帮助您管理关系这一事实并不意味着您必须使用这些功能。在许多复杂的用例中,最好在应用程序层上具有一些处理关系的自定义逻辑。在方面方面,父母/子女也有局限性:例如,您永远无法同时取回父母和子女,而嵌套文档不允许只取回匹配的子女(目前)。