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);