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