本文作者使用的Springboot版本为2.0.6.RELEASE,spring-data-elasticsearch版本为3.0.11.RELEASE,其中elasticsearch版本为6.2.2。其他版本的可能不具有参考价值。

(一)依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

(二)待索引实体对象

备注:若​​elasticsearch​​​中已经存在​​mysql​​​中导入的数据,那么,这里在新建索引实体对象时,​​@Document(indexName = "book", type = "it")​​​必须和​​elasticsearch​​​中的的​​index​​​和​​type​​​对应上,否则下面在初始化​​BookElasticsearchRepository​​时会报错!!!

/**
* ElasticSearch索引对象必须标注@Document注解,indexName为索引名,type为索引类型(PS:这是
* ElasticSearch特性,同样的索引,可以分为不同的类型,来分别做索引)
*/
@Document(indexName = "book", type = "it")
public class Book implements Serializable {
/**
* 坑一:这里的id主键必须为String类型,且必须加@Id注解,否则创建索引时,无法将主键转换成
* 索引id,这样索引id就是null
* @Id是org.springframework.data.annotation.Id
*/
@Id
private String id;
private String name;
private Float price;
private Date publishDate;
}

(三)改造启动类,开启Elasticsearch

/**
* Spring Data系列之Elasticsearch(Redis、Monogdb等被springdata集成的数据库都差不多):
* 开启Elasticsearch
* 在启动类上加上“@Enable数据库Repositories”,这里就是@EnableElasticsearchRepositories
* basePackages指向elasticsearch仓储类所在的包
*/
@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = "org.pc.repository")
public class ElasticsearchApplication {

public static void main(String[] args) {
SpringApplication.run(ElasticsearchApplication.class, args);
}
}

(四)配置elasticsearch

#elasticsearch
spring:
data:
elasticsearch:
#集群名
cluster-name: spring-boot
#注意java的es默认连接端口是9300,9200是http端口,这两个在使用中应注意区分
cluster-nodes: 192.168.10.130:9300

(五)自定义elasticsearch仓储类

@Repository("bookRepository")
public class BookElasticsearchRepository extends AbstractElasticsearchRepository<Book, String> {
/**
* 当AbstractElasticsearchRepository提供的方法不足以完成全部功能时,即可通过该对象自定义
* 操作行为。
*/
private ElasticsearchOperations elasticsearchOperations;
/**
* 注入ElasticsearchOperations,并实例化BookElasticsearchRepository
* 这里注入ElasticsearchOperations对象就是在application.yml中配置的参数自动装载的对象
*
* 坑二:必须super(createElasticsearchEntityInformation(), elasticsearchOperations),否则
* 会报错
*/
@Autowired
public BookElasticsearchRepository(ElasticsearchOperations elasticsearchOperations){
super(createElasticsearchEntityInformation(), elasticsearchOperations);
this.elasticsearchOperations = elasticsearchOperations;
}

/**
* 创建ElasticsearchEntityInformation对象,该对象实现对索引对象相关信息的读取
*/
private static ElasticsearchEntityInformation<Book,String> createElasticsearchEntityInformation() {
TypeInformation<Book> typeInformation = ClassTypeInformation.from(Book.class);

ElasticsearchPersistentEntity<Book> entity = new SimpleElasticsearchPersistentEntity<Book>(typeInformation);

return new MappingElasticsearchEntityInformation<>(entity);
}

/**
* id的展示方式
* @param aLong id
*/
@Override
protected String stringIdRepresentation(String aLong) {
return aLong;
}
}

(六)使用elasticsearch仓储类,实现索引的增删改查

@RestController
public class BookController {
/**
* 备注:因为这里是PagingAndSortingRepository抽象类,所有类型的数据仓库都会继承这个类,所以
* 为了避免数据源切换时,无法识别出哪一个数据源,这里可以根据数据仓库的name来进行鉴别,
* 改造@Repository("bookRepository")加上name,通过@Resource配合识别数据仓库。
*/
@Resource
private PagingAndSortingRepository<Book, String> bookRepository;
@GetMapping("/book/{id}")
public Book getBookById(@PathVariable String id){
Optional<Book> bookOptional = bookRepository.findById(id);
return return bookOptional.orElse(null);;
}

@PostMapping("/book")
public Book addBook(@RequestBody Book book){
book.setPublishDate(new Date(System.currentTimeMillis()));
return bookRepository.save(book);
}
}