spring boot 集成 elasticsearch cr(u)d 、分頁聚合查詢

1 添加maven依賴

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

2. 在yml文件中增加配置

spring:
  elasticsearch: #springboot 默認配置, localhost:9200
      rest:
        uris: ["192.168.99.100:9200"]
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 192.168.99.100:9300
      repositories:
        enabled: true

3. spring elasticsearch具體使用

主要分爲一下幾個步驟

  • 1 瞭解es(elasticsearch簡稱es)基本概念

  • 2 編寫document對象,@Field的Field說明

  • 3 基於spring ElasticsearchRepository基本的crud

  • 4 帶多條件的聚合匹配的分頁查詢

  • 1 瞭解es基本概念

es存儲數據有索引index,類型type,主鍵id三個很關鍵的概念信息。es是一個搜索引擎,也需要進行數據的存儲。通過web工具看,es存儲的數據類似於文檔,可以通過index與type確定一個具體的文檔信息。與數據庫mysql類比推理起來的理解很容易。


elasticsearch mysql
index database(數據庫)
type table(表)
id id(主鍵)
  • 2 編寫document對象

document對象對應的就是es中的文檔。

例如:

@Data
@Document(indexName = "pms", type = "product",shards = 1,replicas = 0)
public class EsProduct implements Serializable {
    private static final long serialVersionUID = -1L;
    @Id
    private Long id;
    @Field(type = FieldType.Keyword)
    private String productSn;
    private Long brandId;
    @Field(type = FieldType.Keyword)
    private String brandName;
    private Long productCategoryId;
    @Field(type = FieldType.Keyword)
    private String productCategoryName;
    private String pic;
    @Field(analyzer = "ik_max_word",type = FieldType.Text)
    private String name;
    @Field(analyzer = "ik_max_word",type = FieldType.Text)
    private String subTitle;
    @Field(analyzer = "ik_max_word",type = FieldType.Text)
    private String keywords;
    private BigDecimal price;
}

FieldType 核心的幾個簡要說明,具體參照官網

Core datatypes
string
    text and keyword
Numeric
    long, integer, short, byte, double, float, half_float, scaled_float
Date
    date
Date nanoseconds
    date_nanos
Boolean
    boolean
Binary
    binary
Range
    integer_range, float_range, long_range, double_range, date_range, ip_range
  • 3 基於spring ElasticsearchRepository基本的crud

es的dao層繼承ElasticsearchRepository接口,即可調用其中spring包裝好的各種方法,以及支持CrudRepository,以及可以通過findby字段進行查詢(都不用寫sql),類似於jpa,也支持分頁。

例如:

public interface EsProductRepository extends ElasticsearchRepository<EsProduct, Long> {
    /**
     * 搜索查詢
     *
     * @param name              商品名稱
     * @param subTitle          商品標題
     * @param keywords          商品關鍵字
     * @param page              分頁信息
     * @return
     */
    Page<EsProduct> findByNameOrSubTitleOrKeywords(String name, String subTitle, String keywords, Pageable page);

}

該接口具有很多crud方法(es不存在修改一說,保存時直接覆蓋)。

ElasticsearchRepositoryj接口繼承了CrudRepository接口,所以它也有crud的方法。

public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S var1);

    <S extends T> Iterable<S> saveAll(Iterable<S> var1);

    Optional<T> findById(ID var1);

    boolean existsById(ID var1);

    Iterable<T> findAll();

    Iterable<T> findAllById(Iterable<ID> var1);

    long count();

    void deleteById(ID var1);

    void delete(T var1);

    void deleteAll(Iterable<? extends T> var1);

    void deleteAll();
}
  • 4 帶多條件的聚合匹配的分頁查詢

在dao層接口中添加該方法即可。Page爲spring自帶的page對象,後期可以自己進行組裝。

   /**
     * 搜索查詢
     *
     * @param name              商品名稱
     * @param subTitle          商品標題
     * @param keywords          商品關鍵字
     * @param page              分頁信息
     * @return
     */
    Page<EsProduct> findByNameOrSubTitleOrKeywords(String name, String subTitle, String keywords, Pageable page);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章