elasticsearch,Java,Jakarta Ee,Search,Search Engine,elasticsearch" /> elasticsearch,Java,Jakarta Ee,Search,Search Engine,elasticsearch" />

Java 如何在ElasticSearch(搜索引擎)中存储具有关系的对象

Java 如何在ElasticSearch(搜索引擎)中存储具有关系的对象,java,jakarta-ee,search,search-engine,elasticsearch,Java,Jakarta Ee,Search,Search Engine,elasticsearch,我将使用ElasticSearch作为我的应用程序中的搜索存储库。 我有几个关于组织的最佳实践的问题 当对象彼此具有关联/关系时,搜索索引中的对象 据我所知,搜索索引是一个平面结构,不符合 关系的方式与数据库的方式相同 假设您拥有以下域对象: 人: -与汽车有一对多的关系 汽车: -属于一人所有,多人对一人拥有 部门: -每个部门都有很多人,每个人可能属于多个部门,多对多 将其存储在搜索索引中的最佳方式是什么?有哪些选择?例如,我想找到属于某个部门的所有人员,或者汽车的马力超过300必和必拓的所

我将使用ElasticSearch作为我的应用程序中的搜索存储库。 我有几个关于组织的最佳实践的问题 当对象彼此具有关联/关系时,搜索索引中的对象

据我所知,搜索索引是一个平面结构,不符合 关系的方式与数据库的方式相同

假设您拥有以下域对象:

: -与汽车有一对多的关系

汽车: -属于一人所有,多人对一人拥有

部门: -每个部门都有很多人,每个人可能属于多个部门,多对多

将其存储在搜索索引中的最佳方式是什么?有哪些选择?例如,我想找到属于某个部门的所有人员,或者汽车的马力超过300必和必拓的所有人员。 如果重要的话,我会使用Java客户端API。

弹性搜索(或Lucene)不是关系数据库,因此您需要扁平化您的关系模型

尝试为获取此结构的视图建模-

Car|Person|Department
这将为您提供查找汽车所需的所有属性。这可以导入到
Car
的文档中

同样地

Person|Department
将为您提供一个人的所有信息。这将帮助您查找
人员

部门
可以是第三个文档


每个实体可以有多个文档。但是关系需要转换为实体的属性。

那么汽车是否内联了一组人员?这是怎么做到的,这就是他们所说的嵌套文档吗?或者它不需要任何特殊处理吗?是的,这辆车会有很多人。您可以将
人员
字段定义为
汽车中的一个
字段。我不是专家(至少有6小时弹性搜索经验),因此欢迎您忽略我。您可以看看如何使用“父”关系来提供一些层次结构,以帮助实现一些基本的规范化。同样,根据您的需求,可以选择交互浏览相关文档(因为一个人将拥有多少辆车?)。只是一些想法,所以如果有任何帮助,请告诉我们。我确实设法让它工作起来了。我所做的是使用嵌套类型。幸运的卢克,我想问你一个关于你成功的问题,这样我可以学到更多。您是为单个文档编制索引还是使用批量索引API?我关心的是,在您的案例中,批量索引嵌套文档是否会导致重复的Person文档。如果你是一个接一个的索引,那么不用担心,我两者都在做。当我想对整个数据库重新编制索引时,我使用批量API,当我插入单个项目时,我使用“普通”索引API。我不确定我是否理解你所说的复制品是什么意思,但我没有得到复制品。我有一个IndexedPerson类,我将其序列化为JSON,它包含了有关汽车和部门的所有需要。这是因为我把汽车和部门做成了“嵌套型”。谢谢。这让我对花时间尝试嵌套文档感到高兴。