将 ElasticSearch 与 Spring Data 结合使用时自动生成数字 id

Posted

技术标签:

【中文标题】将 ElasticSearch 与 Spring Data 结合使用时自动生成数字 id【英文标题】:Automatically generate numerical id when using ElasticSearch with Spring Data 【发布时间】:2018-04-27 14:31:16 【问题描述】:

我目前正在将我所做的一个项目从使用 Hibernate 的 Spring Data 转换为使用 ElasticSearch 的 Spring Data。

之前,我可以使用注释 @GeneratedValue(strategy = GenerationType.IDENTITY) 自动生成我的实体的 ID。这样,当实体被保存时,就会为其生成一个id号。

但是,我似乎找不到 ElasticSearch 用来实现相同结果的注释。

使用Hibernate注解的实体:

@Entity
@Table(name = "person")
public class Person 

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private int age;

    public long getId() 
        return id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    public Person() 
    

    public Person(String name, int age) 
        this.name = name;
        this.age = age;
    

    @Override
    public String toString() 
        return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    

是否有等效于 @GeneratedValue 注释的 ElasticSearch?如果没有,使用 ElasticSearch 时填充 id 字段的最佳方式是什么?

【问题讨论】:

嗨@pike,你知道怎么做吗? 目前似乎不支持此功能:jira.spring.io/browse/DATAES-42 【参考方案1】:

我刚刚遇到了同样的问题,看起来没有这样的注释,但我们可以通过定义一个自定义的 BeforeConvertCallback 来编写一个组件,如果需要,它会设置一个 id。

@Component
public class BookBeforeConvertCallback implements BeforeConvertCallback<Book> 

    @Override
    public Book onBeforeConvert(Book book, IndexCoordinates indexCoordinates) 

        if (book.getId() == null) 
            book.setId(UUIDs.randomBase64UUID());
        

        return book;
    

参考:https://github.com/spring-projects/spring-data-elasticsearch/issues/616#issuecomment-752866566

【讨论】:

【参考方案2】:

https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#search-mapping-entity 上的文档似乎确实表明@GeneratedValue 应该可以正常工作。您是否使用了正确的集成库?

【讨论】:

感谢您的回答,但我正在寻找可以充当 @GeneratedValue 等效项的 ElasticSearch 注释。你碰巧在这方面有使用 ElasticSearch 的经验吗? 抱歉,我了解到您正在使用带有 ElasticSearch 的 Hibernate。如果您使用的是纯 ElasticSearch API,那么只需使用此处记录的 POST:elastic.co/guide/en/elasticsearch/guide/current/index-doc.html @PiotrWilkin Hibernate 仅适用于 SQL 数据库。它不适用于 ElasticSearch。问题是关于 Spring Data Elasticsearch,而不是 Hibernate,也不是“纯 Elasticsearch”。【参考方案3】:

我遇到了同样的问题并使用此代码解决了它:

@Entity
@Table(name = "person")
public class Person 

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @GeneratedValue(generator="generator")
    @org.springframework.data.annotation.Id
    private long id;

【讨论】:

这个答案可能适用于 Spring Data JPA,但不适用于 Spring Data Elasticsearch,这就是问题所在。

以上是关于将 ElasticSearch 与 Spring Data 结合使用时自动生成数字 id的主要内容,如果未能解决你的问题,请参考以下文章

Spring data elasticsearch - 无法将非对象映射与对象映射合并

Spring BootSpring Boot之使用 Spring Data Elasticsearch 整合elasticsearch

Spring Data集成Elasticsearch

全文检索ElasticSearch与Spring boot集成实例

Spring Data Version兼容性VS Elasticsearch版本兼容性

Spring Boot 与ElasticSearch