将 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
全文检索ElasticSearch与Spring boot集成实例