SpringBoot整合Spring Data Elasticsearch


Spring Data Elasticsearch提供了ElasticsearchTemplate工具類,實現了POJO與elasticsearch文檔之間的映射

elasticsearch本質也是存儲數據,它不支持事物,但是它的速度遠比數據庫快得多,

可以這樣來對比elasticsearch和數據庫

索引(indices)--------數據庫(databases)
類型(type)------------數據表(table)
文檔(Document)---------------- 行(row)
字段(Field)-------------------列(Columns ) 

 

整合:

  1.在SprinBoot工程中引入jar包

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

 

  2.配置文件

spring.data.elasticsearch.cluster-name=elasticsearch  //名字必須和elasticsearch.yml里面的cluster.name相同
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300 
spring.data.elasticsearch.repositories.enabled=true

 

  3.創建實體,並對類和屬性進行標注

@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)//標記為文檔類型,ndexName:對應索引庫名稱
type:對應在索引庫中的類型,shards:分片數量,默認5,replicas:副本數量,默認1
public class Item { @Id //主鍵 private Long id; @Field(type = FieldType.Text, analyzer = "ik_max_word") //標記為成員變量
  FieldType,可以是text、long、short、date、integer等
  text:存儲數據時候,會自動分詞,並生成索引
  keyword:存儲數據時候,不會分詞建立索引
  analyzer:分詞器名稱
private String title; //標題 @Field(type = FieldType.Keyword) private String category;// 分類 @Field(type = FieldType.Keyword) private String brand; // 品牌 @Field(type = FieldType.Double) private Double price; // 價格 @Field(index = false, type = FieldType.Keyword)//index:是否索引 private String images; // 圖片地址

  

  4.引入模板ElasticsearchTemplate

   @Autowired private ElasticsearchTemplate elasticsearchTemplate;

  

  5.創建一個索引

     //添加索引
    @Test
    public void addIndex() {
        elasticsearchTemplate.createIndex(Item.class);
    }

 

   6.刪除索引

    //刪除索引
    @Test
    public void delete(){
        elasticsearchTemplate.deleteIndex("item");
    }

  

    7.新增對象

  繼承Repository提供的一些子接口,就能具備各種基本的CRUD功能,這里繼承ElasticsearchCrudRepository

  首先定義一個對象的接口

public interface ItemRepository extends ElasticsearchCrudRepository<Item,Long> {

}

    然后注入ItemRepository

   @Autowired
    private ItemRepository itemRepository;

    新增對象

    //新增一個對象
    @Test
    public void insert(){
        Item item = new Item(2L,"堅果R1","手機","錘子",2500.00,"http://image.baidu.com/13123.jpg");
        //Order order = new Order(20180020,"菜單");
        itemRepository.save(item);
    }

    批量新增

    //批量新增
    @Test
    public void insertList(){
        List<Item> list = new LinkedList<>();
        list.add(new Item(9L,"華為p20","手機","華為",3500.00,"http://image.baidu.com/13123.jpg"));
        list.add(new Item(10L,"華為p30","手機","華為",5450.00,"http://image.baidu.com/13123.jpg"));
        list.add(new Item(11L,"華為p30 pro","手機","華為",6980.00,"http://image.baidu.com/13123.jpg"));
        itemRepository.saveAll(list);
    }

 

    8.查詢

    //根據字段查詢所有
    @Test
    public void queryAll(){
        //升序,相應降序為dscending
        Iterable<Item> items = this.itemRepository.findAll(Sort.by("price").ascending());
        for (Item item : items){
            System.out.println(item);
        }
    }

         9.自定義查詢方法

    Spring Data 的另一個強大功能,是根據方法名稱自動實現功能,你的方法名叫做:findByTitle,那么它就知道你是根據title查詢,然后自動幫你完成,無需寫實現類。當然,方法名稱要符合一定的約定:

 

               

 

   根據手機名查找手機

    //自定義方法,根據Title查詢
    @Test
    public void findByTitle(){
        Item item = this.itemRepository.findByTitle("堅果pro");
        System.out.println(item);
    }

    區間查詢

    //根據區間查詢
 @Test public void queryByPriceBetween(){ List<Item> list = this.itemRepository.findByPriceBetween(2000.00, 3500.00); for (Item item : list) { System.out.println("item = " + item); } }

    模糊查詢

     //模糊查詢
 @Test public void queryLikeTitle(){ List<Item> list = this.itemRepository.findByTitleLike("R2"); for (Item item : list){ System.out.println(item); } }

  

    使用自定義方法需要在接口里面申明方法

public interface ItemRepository extends ElasticsearchCrudRepository<Item,Long> {

    Item findByTitle(String title);

    List<Item> findByPriceBetween(double price1, double price2);

    List<Item> findByTitleLike(String title);
}

 

    10.自定義查詢

    //自定義查詢,查詢數目等
    @Test
    public void matchQuery(){
        // 構建查詢條件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本分詞查詢
        queryBuilder.withQuery(QueryBuilders.matchQuery("title","堅果"));
        //獲取結果
        Page<Item> items = (Page<Item>) this.itemRepository.findAll();
        //條數
        long total = items.getTotalElements();
        System.out.println("total = "+total);
        for (Item item : items){
            System.out.println(item);
        }
    }

關鍵的是NativeSearchQueryBuilder這個類

    分頁查詢

    //分頁查詢
    @Test
    public void queryByPage(){
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("category","手機"));
        int page = 0;
        int size = 2;
        nativeSearchQueryBuilder.withPageable(PageRequest.of(page,size));
        Page<Item> items = (Page<Item>) this.itemRepository.findAll();
        long total = items.getTotalElements();
        int totalPage = items.getTotalPages();
        int nowPage = items.getNumber();
        int pageSize = items.getSize();
        System.out.println("總條數 = "+total);
        System.out.println("總頁數 = "+totalPage);
        System.out.println("當前頁 = "+nowPage);
        System.out.println("每頁大小 = "+pageSize);
        for (Item item : items){
            System.out.println(item);
        }
    }

  

   還有很多,就不意義列舉

  在elasticsearch-head上查看數據

          關於安裝elasticsearch-head,參考:https://www.cnblogs.com/xuwenjin/p/8792919.html,

 

 

  Spring Data Elasticsearch文檔:https://docs.spring.io/spring-data/elasticsearch/docs/3.1.10.RELEASE/reference/html/  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM