使用来自具有不同包结构的 2 个不同应用程序的相同弹性索引来存储数据(HibernateSearch + Elastic)
Using the same Elastic Index from 2 different applications with different package structures to store the data(HibernateSearch + Elastic)
我们在其中一台应用程序服务器上安装了 Elastic 5.6.10 和 HibernateSearch ORM 5.11。4.Final 现在我们计划通过我们的一项微服务使用相同的 Elastic 实例及其索引(spring 引导,但使用相同的 HibernateSearch 和 Elastic 版本)。这样做的原因是,我们计划将来自这两个应用程序的数据存储到一个索引中(因为它们是相同的数据),以便我们可以从两个应用程序中搜索彼此的数据。
我们面临的问题是实体的限定名称。与第一个应用程序一样,实体位于 com.abc.data.to.FirstAppClassTO 下,微服务上的结构类似于 com.abc.service.model.MicroserviceClassTO(或任何其他包类型)。现在的问题是我们正在从我们的第一个应用程序创建初始索引。但是现在,如果我们尝试将 com.abc.service.model.MicroserviceClassTO 作为索引,它将创建一个新索引,或者如果我们提供相同的索引名称,它将覆盖现有的索引名称(它是从第一个应用程序创建的)。
在 hibernate search 或 Elastic Search 中有没有什么方法可以按照我们想要的方式实现它。
第一个应用程序 TO 和 Elastic Schema:
@Entity
@Indexed(index="master_index")
public class UserTO{
Elastic 架构:
{
"master_client_index" : {
"aliases" : { },
"mappings" : {
"com.abc.pt.svc.data.to.UserTO" : {
微服务 TO 和架构:
@Entity
@Indexed(index = "master_index" )
@Table(name = "USER")
public class MSUserTO implements Serializable {
Elastic 架构:
{
"master_index" : {
"aliases" : { },
"mappings" : {
"com.abc.project.entity.user.MSUserTO" : {
请分享 HibernateSearch/ElasticSearch 提供的 ways/concepts/logic 以完成此操作。
您的问题中没有明确说明,但我认为问题在于映射的名称,这在您的两个应用程序中有所不同?
com.abc.pt.svc.data.to.UserTO
com.abc.project.entity.user.MSUserTO
恐怕在 Hibernate Search 5 中没有自定义映射名称的选项。原因是... Elasticsearch 在更新的版本中删除了映射名称。
但是 Hibernate Search 5 中的 Elasticsearch 支持是实验性的,Hibernate Search 5 永远不会支持 Elasticsearch 6+。
所以,要解决这个问题,你需要升级到Hibernate Search 6,它对Elasticsearch有稳定的支持。 Hibernate Search 6 仍处于 Beta 阶段,但它非常稳定并且经过了良好的测试。但是,它的 API 与 Hibernate Search 5 不同,因此迁移需要一些努力。
如果您升级到 Hibernate Search 6,您将能够根据需要使用 Elasticsearch 5.6,因为 Hibernate Search 6 以不同方式处理映射名称。只需将 type name mapping strategy 设置为 index-name
,您就可以在两个不同的应用程序中使用相同的索引。
但您还可以选择升级到 Elasticsearch 的从未升级过的版本(例如 7.8)。我会推荐这个,因为 Elasticsearch 5.6 已结束生命 one year ago 并且可能不会再得到任何错误修复。
我们在其中一台应用程序服务器上安装了 Elastic 5.6.10 和 HibernateSearch ORM 5.11。4.Final 现在我们计划通过我们的一项微服务使用相同的 Elastic 实例及其索引(spring 引导,但使用相同的 HibernateSearch 和 Elastic 版本)。这样做的原因是,我们计划将来自这两个应用程序的数据存储到一个索引中(因为它们是相同的数据),以便我们可以从两个应用程序中搜索彼此的数据。
我们面临的问题是实体的限定名称。与第一个应用程序一样,实体位于 com.abc.data.to.FirstAppClassTO 下,微服务上的结构类似于 com.abc.service.model.MicroserviceClassTO(或任何其他包类型)。现在的问题是我们正在从我们的第一个应用程序创建初始索引。但是现在,如果我们尝试将 com.abc.service.model.MicroserviceClassTO 作为索引,它将创建一个新索引,或者如果我们提供相同的索引名称,它将覆盖现有的索引名称(它是从第一个应用程序创建的)。
在 hibernate search 或 Elastic Search 中有没有什么方法可以按照我们想要的方式实现它。
第一个应用程序 TO 和 Elastic Schema:
@Entity
@Indexed(index="master_index")
public class UserTO{
Elastic 架构:
{
"master_client_index" : {
"aliases" : { },
"mappings" : {
"com.abc.pt.svc.data.to.UserTO" : {
微服务 TO 和架构:
@Entity
@Indexed(index = "master_index" )
@Table(name = "USER")
public class MSUserTO implements Serializable {
Elastic 架构:
{
"master_index" : {
"aliases" : { },
"mappings" : {
"com.abc.project.entity.user.MSUserTO" : {
请分享 HibernateSearch/ElasticSearch 提供的 ways/concepts/logic 以完成此操作。
您的问题中没有明确说明,但我认为问题在于映射的名称,这在您的两个应用程序中有所不同?
com.abc.pt.svc.data.to.UserTO
com.abc.project.entity.user.MSUserTO
恐怕在 Hibernate Search 5 中没有自定义映射名称的选项。原因是... Elasticsearch 在更新的版本中删除了映射名称。 但是 Hibernate Search 5 中的 Elasticsearch 支持是实验性的,Hibernate Search 5 永远不会支持 Elasticsearch 6+。
所以,要解决这个问题,你需要升级到Hibernate Search 6,它对Elasticsearch有稳定的支持。 Hibernate Search 6 仍处于 Beta 阶段,但它非常稳定并且经过了良好的测试。但是,它的 API 与 Hibernate Search 5 不同,因此迁移需要一些努力。
如果您升级到 Hibernate Search 6,您将能够根据需要使用 Elasticsearch 5.6,因为 Hibernate Search 6 以不同方式处理映射名称。只需将 type name mapping strategy 设置为 index-name
,您就可以在两个不同的应用程序中使用相同的索引。
但您还可以选择升级到 Elasticsearch 的从未升级过的版本(例如 7.8)。我会推荐这个,因为 Elasticsearch 5.6 已结束生命 one year ago 并且可能不会再得到任何错误修复。