spring data elasticsearch _id注意事项

3,928 阅读1分钟

1、实体类

package elasticsearch.test.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

@Document( indexName = "trade" , type = "book")
public class Book {

    //这里id名称任意,只要有@Id,对应的就是es的_id,注意两点
    //1、如果没有此时不写getter,setter,那么在_source中是不包含id字段的
    //2、如果设置了book.setId("1"),那么为_source和_id相等,都为1,记住这个1是字符串哦;如果让_source 的id为Number型,则可以设置属性为private Intger id,然后实体操作类的泛型必须为对应为Intger
    
    @Id
    private String id; 

    private String bookName;
    private String author;

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

2、实体操作类

package elasticsearch.test.model;

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;

import java.util.List;


@Component
public interface BookRepository extends ElasticsearchRepository<Book, String> {
    //注意这里的<Book, String>右边的String,对应的就是实体的@Id,二者必须匹配,否则转换可能会出现null的情况
}

3、测试

public String index() {
    Book book = new Book();
    book.setBookName(String.valueOf(Math.random()));
    book.setAuthor( "吴承恩" );
    bookRepository.index( book );
    return "elasticsearch";
}

生成结果文档

{
  "_index": "trade",
  "_type": "book",
  "_id": "PrGQXXABITL0BdquSS4C",
  "_version": 1,
  "_score": 1,
  "_source": {
    "bookName": "0.19500748689777891",
    "author": "吴承恩"
  }
}

4、总结

  • 如果mysql等其他迁移到es的,那么一定有自增id,此时设置_id_source中id相等
  • 如果直接生成的es的,则让es自动生成唯一识别串_id