如何使用Spring Data为Elastic Search设置_id字段

时间:2016-02-19 21:58:14

标签: spring-data spring-data-elasticsearch

我使用@Id注释在我的实体中定义了一个字段。但是这个@Id没有映射到弹性搜索文档中的_id。 _id值由弹性搜索自动生成。

我正在使用" org.springframework.data.annotation.Id;"。这是@Id支持spring-data-es吗?

我的实体:

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@Document(
    indexName = "my_event_db", type = "my_event_type"
)
public class EventTransactionEntity {
   @Id
   private long event_pk;

   public EventTransactionEntity(long event_pk) {
      this.event_pk = event_pk;
   }

   private String getEventPk() {
      return event_pk;
   }
}

我的存储库类:

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import com.softwareag.pg.pgmen.events.audit.myPackage.domain.EventTransactionEntity;
public interface EventTransactionRepository extends ElasticsearchRepository<EventTransactionEntity, Long> {
}

我的申请代码:

public class Application {
   @Autowired
   EventTransactionRepository eventTransactionRepository;

   public void setEventTransactionRepository(EventTransactionRepository repo)  
   {
       this.eventTransactionRepository = repo;
   }

   public void saveRecord(EventTransactionEntity entity) {
       eventTransactionRepository.save(entity); 
   }

    public void testSave() {
       EventTransactionEntity entity = new EventTransactionEntity(12345);
       saveRecord(entity);
   }
}

执行ES查询(保存后):

http://localhost:9200/my_event_db/my_event_type/_search

预期结果:

{
"hits": {
  "total": 1,
  "max_score": 1,
  "hits": [
  {
    "_index": "my_event_db",
    "_type": "my_event_type",
    "_id": "12345",
    "_score": 1,
    "_source": {
      "eventPk": 12345,
    }
  }]
}}

获得的结果:

{
"hits": {
  "total": 1,
  "max_score": 1,
  "hits": [
  {
    "_index": "my_event_db",
    "_type": "my_event_type",
    "_id": "AVL7WcnOXA6CTVbl_1Yl",
    "_score": 1,
    "_source": {
      "eventPk": 12345,
    }
  }]
}}

你可以看到我在结果中得到的_id,&#34; _id&#34;:&#34; AVL7WcnOXA6CTVbl_1Yl&#34;。但我希望_id字段等于eventPk值。

请帮忙。感谢。

2 个答案:

答案 0 :(得分:2)

问题在于你的getter应该是public@Id字段的类型相同:

public long getEvent_pk() {
   return event_pk;
}

答案 1 :(得分:0)

如果使用字段名称为id

的字符串类型ID,则可以映射它
private String id;

这很有用。看起来只接受字符串类型id字段。