四、Springboot2.0.5整合Spring data elasticSearch3.0.10
阿新 • • 發佈:2018-12-14
本文作者使用的Springboot版本為2.0.5.RELEASE,spring-data-elasticsearch版本為3.0.10.RELEASE,其中elasticsearch版本為5.6.11。其他版本的可能不具有參考價值。
(一)依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
(二)待索引實體物件
/** * 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);
}
}