1. 程式人生 > >四、Springboot2.0.5整合Spring data elasticSearch3.0.10

四、Springboot2.0.5整合Spring data elasticSearch3.0.10

  本文作者使用的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);
    }
}