【问题标题】:How to store objects which have relations in ElasticSearch (Search engine)如何在 ElasticSearch(搜索引擎)中存储有关系的对象
【发布时间】:2013-03-26 13:34:40
【问题描述】:

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

据我所知,搜索索引是一种扁平结构,不适用于 关系的方式与数据库相同。

假设你有这些域对象:

人物: - 与 Car

有一对多的关系

汽车: - 由一个 Person 拥有,与 Person

多对一

部门: - 每个部门有很多,每个可能属于很多部门,多对多 p>

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

【问题讨论】:

  • 我不是专家(至少有 6 小时的弹性搜索经验),所以欢迎您忽略我。您可能会看一下“父”关系的使用,以提供一些层次结构来帮助进行一些基本的规范化。同样,根据您的要求,交互式浏览相关文档可能是一种选择(因为一个人将拥有多少辆车?)。只是想法,如果有任何帮助,请告诉我们。
  • 我实际上设法让它工作。我所做的是使用嵌套类型。效果很好。
  • LuckyLuke 一个关于你成功的简单问题,这样我可以学到更多。您是在索引单个文档还是使用批量索引 API?我担心的是批量索引嵌套文档是否会导致您的案例中出现重复的个人文档。如果您是一一索引,那就不用担心了。
  • 我都在做。当我想重新索引整个数据库时,我使用批量 API,当我插入单个项目时,我使用“普通”索引 API。我不确定我理解你所说的重复是什么意思,但我没有得到重复。我有一个 IndexedPerson 类,我将其序列化为 JSON,其中包含有关汽车和部门的所有信息。这很有效,因为我已将汽车和部门设为“嵌套类型”。
  • 谢谢。花一些时间尝试嵌套文档让我感到更开心。

标签: java jakarta-ee search search-engine elasticsearch


【解决方案1】:

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

尝试为获得这种结构的视图建模 -

Car|Person|Department

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

同样

Person|Department

会给你一个人的所有信息。这将帮助您查找Person

Department 可以是第三个文档。

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

【讨论】:

  • 那么这辆车有排成一排的人吗?这是怎么做的,这就是他们所说的嵌套文档吗?还是不需要特殊处理?
  • 是的,Car 会有一组人。您可以在Car 中将Person 字段定义为ArrayType
猜你喜欢
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 2019-02-12
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多