SpringBoot整合Easy-Es
Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些方面甚至比MP更简单,同时也融入了更多E
目录
一、什么是Easy-Es
Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些方面甚至比MP更简单,同时也融入了更多Es独有的功能,助力您快速实现各种场景的开发.
二、使用场景
2.1 检索类服务
- 搜索文库
- 电商商品检索
- 海量系统日志检索
2.2 问答类服务(本质上也是检索类)
- 在线智能客服
- 机器人
2.3 地图类服务
- 打车app
- 外卖app
- 社区团购配送
- 陌生人社交
2.4 官网
三、spring boot整合 Easy-Es
3.1 pom.xml
其中easy-es-boot-starter 安装最新版,可以复制easy-es-boot-starter到maven中央仓库搜索
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</exclusion>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>2.0.0-beta1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.14.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.14.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.2 配置文件
如果有账号密码自行加上
# Easy-Es配置部分
easy-es:
# 启用Easy-Es功能
enable: true
# 设置Elasticsearch服务器地址和端口
address: 192.168.23.27:9200
# 全局配置项,设置是否打印执行的DSL语句(便于调试)
global-config:
print-dsl: true
Elasticsearch DSL (Domain Specific Language) 是一种专门设计用来与Elasticsearch搜索引擎进行交互的查询语言。它是一种基于JSON格式的查询语法,允许用户以结构化的方式来构建复杂的查询、过滤条件、聚合操作以及其他高级功能。
通过Elasticsearch DSL,开发人员可以灵活且高效地执行各种查询操作,包括全文本搜索、精确匹配、范围查询、布尔组合查询、排序、分页、高亮显示文本、统计计算、地理位置查询以及复杂的聚合分析等。
例如,一个简单的Elasticsearch DSL查询语句可能是查找索引my_index
中field1
字段包含关键词value1
的文档
3.3 创建、删除、查询索引
{
"query": {
"match": {
"field1": "value1"
}
}
}
3.4 创建一个实体类
@IndexName( aliasName = "es_product")
public class EsProduct {
@IndexId(type = IdType.CUSTOMIZE)
private Integer id;
@IndexField( fieldType= FieldType.TEXT, analyzer = Analyzer.IK_MAX_WORD,searchAnalyzer = Analyzer.IK_MAX_WORD)
private String name;
@IndexField( fieldType= FieldType.INTEGER)
private Integer categoryId;
@IndexField( fieldType= FieldType.DOUBLE) // 12.56
private BigDecimal price;
@IndexField( fieldType= FieldType.TEXT, analyzer = Analyzer.IK_MAX_WORD)
private String brief;
@IndexField( fieldType= FieldType.KEYWORD)
private String img;
@IndexField( fieldType= FieldType.TEXT, analyzer = Analyzer.IK_MAX_WORD)
private List<String> tags;
@IndexField( fieldType= FieldType.INTEGER) //198
private Integer highOpinion;
@IndexField( fieldType= FieldType.INTEGER)
private Integer salesVolume;
@IndexField( fieldType= FieldType.DATE)
private LocalDateTime productionDate;
}
3.5 新建Mapper类,类似Mybatis的dao
package com.by.dao;
import cn.easyes.core.core.BaseEsMapper;
import com.by.model.EsProduct;
public interface EsProductMapper extends BaseEsMapper<EsProduct> {
}
3.6 启动类扫描 dao
@SpringBootApplication
@EsMapperScan("com.by.dao")
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
四、代码展示
@Test
void insert() {
EsProduct esProduct = EsProduct.builder()
.id(1)
.name("小米")
.img("图片地址")
.brief("小米(MI)Redmi Note12 5G 120Hz OLED屏幕 骁龙4移动平台 5000mAh长续航 8GB+128GB子夜黑 小米红米")
.price(new BigDecimal(18))
.categoryId(1)
.highOpinion(20)
.productionDate(LocalDateTime.now())
.salesVolume(99)
.tags(CollUtil.newArrayList("120高刷","舒适护眼"))
.build();
esMapper.insert(esProduct);
}
@Test
void insert2() {
delete();
List<EsProduct> esProducts = CollUtil.newArrayList();
for (int i = 1; i <= 10; i++) {
EsProduct esProduct = EsProduct.builder()
.id(i)
.name("小米"+i)
.img("图片地址"+i)
.brief("小米(MI)Redmi Note"+i+" 5G 120Hz OLED屏幕 骁龙4移动平台 5000mAh长续航 8GB+128GB子夜黑 小米红米")
.price(new BigDecimal(500.36+i))
.categoryId(1)
.highOpinion(100+i)
.productionDate(LocalDateTime.now())
.salesVolume(200+i)
.tags(CollUtil.newArrayList("12"+i+"高刷","舒适护眼"))
.build();
esProducts.add(esProduct);
}
esMapper.insertBatch(esProducts);
}
@Test
void update() {
EsProduct esProduct = EsProduct.builder()
.id(1)
.name("su7")
.img("图片地址")
.brief("小米汽车")
.price(new BigDecimal(18))
.categoryId(9)
.highOpinion(20)
.productionDate(LocalDateTime.now())
.salesVolume(99)
.tags(CollUtil.newArrayList("120高刷","舒适护眼"))
.build();
Integer integer = esMapper.updateById(esProduct);
}
@Test
void delete() {
Integer batchIds = esMapper.deleteBatchIds(CollUtil.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
}
@Test
void select() {
LambdaEsQueryWrapper queryWrapper = new LambdaEsQueryWrapper<EsProduct>();
queryWrapper.eq("id",1);
List list = esMapper.selectList(queryWrapper);
}
@Test
void select2() {
LambdaEsQueryWrapper queryWrapper = new LambdaEsQueryWrapper<EsProduct>();
queryWrapper.queryStringQuery("汽车之家"); //所有字段都去匹配
List list = esMapper.selectList(queryWrapper);
}
@Test
void select3() {
LambdaEsQueryWrapper queryWrapper = new LambdaEsQueryWrapper<EsProduct>();
queryWrapper.eq("categoryId",1);
List list = esMapper.selectList(queryWrapper);
}
@Test
void select4() {
LambdaEsQueryWrapper<EsProduct> queryWrapper = new LambdaEsQueryWrapper<>();
queryWrapper.in(EsProduct::getCategoryId,1,9);
List list = esMapper.selectList(queryWrapper);
}
@Test
void select5() {
LambdaEsQueryWrapper<EsProduct> queryWrapper = new LambdaEsQueryWrapper<>();
//queryWrapper.match(EsProduct::getBrief,"汽车",1.0F);
//queryWrapper.match(EsProduct::getName,"汽车",1.0F);
//queryWrapper.multiMatchQuery("汽车", Operator.OR, EsProduct::getName,EsProduct::getBrief);
queryWrapper.in("categoryId",1,9); //where categroyId in (1,9) and ( name like '%汽车%' or brief like '%汽车%')
queryWrapper.and(
w->w.match(EsProduct::getBrief,"汽车",1.0F)
.or().match(EsProduct::getName,"汽车",2.0F));
List list = esMapper.selectList(queryWrapper);
String dsl = esMapper.getSource(queryWrapper);
System.out.println(dsl);
}
@Test
void select6() {
LambdaEsQueryWrapper<EsProduct> queryWrapper = new LambdaEsQueryWrapper<>();
queryWrapper.in("categoryId",1,9); //where categroyId in (1,9) and ( name like '%汽车%' or brief like '%汽车%')
queryWrapper.and(
w->w.match(EsProduct::getBrief,"高刷",1.0F)
.or().match(EsProduct::getName,"高刷",2.0F)
.or().match(EsProduct::getTags,"高刷",1.0F));
queryWrapper.orderByDesc(EsProduct::getSalesVolume);
EsPageInfo<EsProduct> esProductEsPageInfo = esMapper.pageQuery(queryWrapper, 2, 3);
String dsl = esMapper.getSource(queryWrapper);
System.out.println(dsl);
}
@Test
void select7() {
LambdaEsQueryWrapper<EsProduct> queryWrapper = new LambdaEsQueryWrapper<>();
queryWrapper.match(EsProduct::getName,"水汽车门");
List<EsProduct> esProducts = esMapper.selectList(queryWrapper);
}
五、 原生Api调用
5.1查看索引mapping关系
GET /es_product/_mapping
5.2查看某个文档,具体字段的分词
GET /product/_doc/2/_termvectors?fields=brief
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)