首頁 > 軟體

SpringBoot整合ElasticSearch的範例程式碼

2022-02-16 19:00:12

 

一、Elasticseach介紹

1.簡單介紹

官網:開源搜尋:Elasticsearch、ELK Stack 和 Kibana 的開發者 | Elastic

https://www.elastic.co/cn/

ElasticSeach詳細安裝教學--圖文介紹超詳細

令人記憶深刻的口號:能夠發現意料之中以及意料之外的情況

Elasticsearch也是基於Lucene的全文檢索庫,本質也是儲存資料,很多概念與MySQL類似的。是一種全文檢索技術。

Elasticsearch 是位於 Elastic Stack 核心的分散式搜尋和分析引擎。Logstash 和 Beats 有助於收集、聚合和豐富您的資料並將其儲存在 Elasticsearch 中。Kibana 使您能夠以互動方式探索、視覺化和分享對資料的見解,並管理和監控堆疊。Elasticsearch 是索引、搜尋和分析魔法發生的地方。

Elasticsearch 是一個基於JSON的分散式搜尋和分析引擎。

Elasticsearch是用Java語言開發的,並作為Apache許可條款下的開放原始碼釋出,是一種流行的企業級搜尋引擎。Elasticsearch用於雲端計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便。

2.對比關係:

索引(indices)--------------------------------Databases 資料庫
 
  型別(type)-----------------------------Table 資料表
     檔案(Document)----------------Row 行
       欄位(Field)-------------------Columns 列

3.詳細說明:

概念

說明

索引庫(indices)

indices是index的複數,代表許多的索引,

型別(type)

型別是模擬mysql中的table概念,一個索引庫下可以有不同型別的索引,比如商品索引,訂單索引,其資料格式不同。不過這會導致索引庫混亂,因此未來版本中會移除這個概念

檔案(document)

存入索引庫原始的資料。比如每一條商品資訊,就是一個檔案

欄位(field)

檔案中的屬性

對映設定(mappings)

欄位的資料型別、屬性、是否索引、是否儲存等特性

4.查出資料的解釋

 took:查詢花費時間,單位是毫秒
 time_out:是否超時
 _shards:分片資訊
 hits:搜尋結果總覽物件 
   total:搜尋到的總條數
   max_score:所有結果中檔案得分的最高分
   hits:搜尋結果的檔案物件陣列,每個元素是一條搜尋到的檔案資訊 
     _index:索引庫
     _type:檔案型別
     _id:檔案id
     _score:檔案得分
     _source:檔案的源資料

 二、SpringBoot整合Elasticseach

1.引入依賴

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

2.新增設定

spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 192.168.7.132:9300

3.建立pojo類與索引對應

package com.leyou.elasticsearch.pojo;
 
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
 * 建立pojo類與索引對應
 *
 * @author Promsing(張有博)
 * @version 1.0.0
 * @since 2022/1/26 - 20:35
 */
@Document(indexName = "item", type = "docs", shards = 1, replicas = 0)
public class Item {
    @Id
    private  Long id;
    /**
     * 標題
     */
    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String title;
     * 分類
    @Field(type = FieldType.Keyword)
    private  String category;
     * 品牌
    private  String brand;
     * 價格
    @Field(type = FieldType.Double)
    private  Double price;
     * 圖片地址
    private  String images;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    public String getTitle() {
        return title;
    public void setTitle(String title) {
        this.title = title;
    public String getCategory() {
        return category;
    public void setCategory(String category) {
        this.category = category;
    public String getBrand() {
        return brand;
    public void setBrand(String brand) {
        this.brand = brand;
    public Double getPrice() {
        return price;
    public void setPrice(Double price) {
        this.price = price;
    public String getImages() {
        return images;
    public void setImages(String images) {
        this.images = images;
    public Item() {
    public Item(Long id, String title, String category, String brand, Double price, String images) {
    @Override
    public String toString() {
        return "Item{" +
                "id=" + id +
                ", title='" + title + ''' +
                ", category='" + category + ''' +
                ", brand='" + brand + ''' +
                ", price=" + price +
                ", images='" + images + ''' +
                '}';
}

4.SpringData封裝了基礎的增刪改查,自定義增刪改查

這裡需要繼承介面-ItemRepository 

/**
 * 自定義的增刪改查介面
 *
 * @author Promsing(張有博)
 * @version 1.0.0
 * @since 2022/1/27 - 15:10
 */
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
 
    List<Item> findByTitle(String title);
    List<Item> findByPriceBetween(Double d1,Double d2);
}

5.測試方法--增刪改查

package com.leyou.elasticsearch;
 
import com.leyou.elasticsearch.dao.ItemRepository;
import com.leyou.elasticsearch.pojo.Item;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
 * 測試ES的增刪改查
 *
 * @author Promsing(張有博)
 * @version 1.0.0
 * @since 2022/1/26 - 20:57
 */
@SpringBootTest(classes = ElasticsearchApplication.class)
@RunWith(SpringRunner.class)
public class ElasticsearchTest {
    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;//ES的模板類
    private ItemRepository itemRepository;//Item的增刪改查
    /**
     * 建立索引庫
     */
    @Test
    public void testIndex(){
        this.elasticsearchTemplate.createIndex(Item.class);
        this.elasticsearchTemplate.putMapping(Item.class);
        //this.elasticsearchTemplate.deleteIndex();
    }
     * 插入與更新
    public void testCreate(){
        Item item = new Item(1L,"小米手機9","手機","小米",3999.00,"https:www.baidu.com");
        Object save = this.itemRepository.save(item);
        List<Item> list = new ArrayList<>();
        list.add(new Item(2L, "堅果手機R1", " 手機", "錘子", 3699.00, "http://image.leyou.com/123.jpg"));
        list.add(new Item(3L, "華為META10", " 手機", "華為", 4499.00, "http://image.leyou.com/3.jpg"));
        // 接收物件集合,實現批次新增
        Iterable<Item> items = itemRepository.saveAll(list);
        System.out.println(items);
     * 刪除
    public void testDelete(){
        Item item=new Item(1L,"小米手機9","手機","小米",3999.00,"https:www.baidu.com");
        this.itemRepository.delete(item);
     * 查詢
    public void testFind(){
        System.out.println("-----主鍵查詢------");
        Optional<Item> byId = this.itemRepository.findById(1L);
        System.out.println(byId.get());
        System.out.println("-----查詢全部------");
        Iterable<Item> all = this.itemRepository.findAll();
        all.forEach(i-> System.out.println(i));
        System.out.println("-----排序查詢(升序降序)------");
        Iterable<Item> price = this.itemRepository.findAll(Sort.by("price").descending());
        price.forEach(System.out::println);
     * 呼叫自定義方法
    public void testFindByU(){
        List<Item> phone = this.itemRepository.findByTitle("手機");
//        phone.forEach(i->{
//            System.out.println(i);
//        });
        List<Item> byPriceBetween = this.itemRepository.findByPriceBetween(4000.0, 5000.0);
        byPriceBetween.forEach(i-> System.out.println(i));
     * 批次插入
    public void indexList() {
        list.add(new Item(1L, "小米手機7", "手機", "小米", 3299.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(2L, "堅果手機R1", "手機", "錘子", 3699.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(3L, "華為META10", "手機", "華為", 4499.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(4L, "小米Mix2S", "手機", "小米", 4299.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(5L, "榮耀V10", "手機", "華為", 2799.00, "http://image.leyou.com/13123.jpg"));
        itemRepository.saveAll(list);
     * 高階查詢
    public void testSearch(){
        //通過查詢構建器工具構建--重點:QueryBuilders:詞條、模糊、範圍
        MatchQueryBuilder queryBuilder= QueryBuilders.matchQuery("title","手機");
        //獲取結果集
        Iterable<Item> items = this.itemRepository.search(queryBuilder);
        items.forEach(System.out::println);
     * 重點--自定義查詢
    public void testNative(){
        // 構建自定義查詢構建器
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 新增基本查詢條件
        queryBuilder.withQuery(QueryBuilders.matchQuery("title","手機"));
        // 查詢分頁結果集
        Page<Item> itemPage = this.itemRepository.search(queryBuilder.build());
        System.out.println(itemPage.getTotalPages());
        System.out.println(itemPage.getTotalElements());
        itemPage.forEach(i-> System.out.println(i));
     * 重點--分頁查詢
    public void testPage(){
        queryBuilder.withQuery(QueryBuilders.matchQuery("category","手機"));
        queryBuilder.withPageable(PageRequest.of(1,2));
     * 重點--排序
    public void testSort(){
        queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
}

到此這篇關於SpringBoot整合Elasticseach的文章就介紹到這了,更多相關SpringBoot整合Elasticseach內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com