【问题标题】:Save composite key data to elastic search document将复合键数据保存到弹性搜索文档
【发布时间】:2019-10-04 13:39:25
【问题描述】:

我正在使用休眠环境来审核我的表的数据并保存在 Oracle DB 中。我正在使用 Spring Data 弹性搜索通过 Java 代码读取并保存到弹性搜索索引的审计数据。我有一个复合键(id 和 rev),它定义了一个唯一的行来保存数据,但对于弹性搜索,我无法提供复合键。它只占用 rev(标识符)列并替换数据。

Hibernate 环境背景信息: rev 是 hibernate 提供的默认标识符,对于同时修改的记录列表,它会创建相同的 rev id:

Eg: id    rev    comments
     1     1      newly created
     2     1      newly created
     1     2      modified
     2     2      modified

前 2 行是同时创建的,下一次我修改了这两个行并进行了更新,因此 hibernate envers 为 1 次保存创建了相同的 rev id。

@Entity
@IdClass(MyEmbeddedId.class)
@Document(indexName = "#{@indexName}", type = "my-document", shards = 1, replicas = 0, refreshInterval = "-1")
@Getter @Setter
public class MyClassAudit {
    @Id
    private Long id;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @org.springframework.data.annotation.Id --> (this is for elastic search _id)
    private Long rev;
}

@Getter @Setter
public class MyEmbeddedId implements Serializable {
    private Long id;
    private Long rev;
}

Java 代码:

List<MyClass> list = repository.findById(id);
elasticSearchRepository.saveAll(list)

弹性搜索库接口:

public interface MyElasticSearchRepository extends GenericSearchRepository<MyClassAudit, Long> {}

当我将数据保存到弹性搜索时,所有 4 条记录都应按照示例中给出的方式保存,但只保存 2 条记录,如下所示:

_id    id    rev    comments
  1     2     1      newly created
  2     2     2      modified

这是因为 rev 被视为弹性搜索中的标识符,并且正在更新第二条记录。

如何使弹性搜索考虑复合键来维护唯一记录? PS:_id 是弹性搜索标识符。由于 rev 具有 spring 数据注释 id,因此 rev 被视为弹性搜索中的标识符

【问题讨论】:

    标签: elasticsearch spring-data spring-data-elasticsearch composite-key


    【解决方案1】:

    Elasticsearch 本身没有复合键的概念。 Spring Data Elasticsearch 采用 @Id 注释元素并使用它的 toString() 方法为 Elasticsearch 创建 id 条目(并将字段存储在源中)。

    所以 - 如果没有尝试过 - 您可以使用 MyEmbeddedId 类作为 MyClassAudit 类的字段属性并使用 @Id 对其进行注释。但是你必须在你的类中有这个属性,它不会被合成。

    这可能会与休眠的注释冲突,但我认为在存储之间共享一个实体并使用混合注释不是一个好主意。

    【讨论】:

    • 感谢您的回答。我尝试了这种方法,但它会抛出 ClassCastException,因为 spring 数据弹性搜索存储库接口提供如下 Id 并且不接受 MyEmbeddedId 类型。 ElasticsearchRepository
    • 你能发布异常堆栈跟踪吗?哪个类不能转换成什么?
    • MyEmbeddedId 对象无法转换为 ID。
    • 引起:java.lang.IllegalArgumentException:org.springframework.data.elasticsearch.repository.support.ElasticsearchRepositoryFactory.getRepositoryBaseClass(ElasticsearchRepositoryFactory.java:90) 中不支持的 ID 类型类 com.example.MyEmbeddedId /跨度>
    • 解决了 id 与复合键连接的问题,如下所示:@Transient @org.springframework.data.annotation.Id private Long id; 并使用连接复合键的 java 代码设置 id:obj.setId(Long.valueOf(String.valueOf(id)+String. valueOf(rev)));
    猜你喜欢
    • 1970-01-01
    • 2016-08-19
    • 2021-06-20
    • 2015-12-18
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多