项目中使用到EE对ElasicSearch进行使用。
Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的低码开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版
EE开发文档
二、基本使用1.导入依赖
<dependency>
<groupId>io.github.xpc1024</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>0.9.11</version>
</dependency>
2.修改配置文件
easy-es:
enable: true #默认为true,若为false则认为不启用本框架
address : 127.0.0.1:9200 # es的连接地址,必须含端口 若为集群,则可以用逗号隔开 例如:127.0.0.1:9200,127.0.0.2:9200
3.启动类配置注解
@EsMapperScan("【扫描dao包路径】")
4.实体类使用注解
@TableName("【索引名称】")
5.字段注解
//索引ID注解,type:CUSTOMIZE为自定义es索引ID 官方文档有三种,需要自提
@TableId(type = CUSTOMIZE)
private String id;
//已某字段为例 fieldType-文档类型 analyzer-es分词类型WHITESPACE是根据空格分词的,更多分词类型描述如下,看es官方文档也行
@TableField(value = "【索引对应字段名称=实体类定义名称比较好】",fieldType = FieldType.TEXT, analyzer = Analyzer.WHITESPACE, searchAnalyzer = Analyzer.WHITESPACE)
分词名称 | 描述 |
---|---|
Standard Analyzer | 默认分词器,按词切分,转小写处理,也可以过滤停用词(默认关闭) 在 ES 中的名称为 standard |
Simple Analyzer | 按照非字母切分,非字母会被去除,转小写处理 在 ES 中的名称为 simple |
Stop Analyzer | 按照非字母切分,非字母会被去除,转小写处理,停用词过滤(the、a、is 等) 在 ES 中的名称为 stop |
Whitespace Analyzer | 按照空格切分,不转小写。 在 ES 中的名称为 whitespace |
Keyword Analyzer | 不做任何的分词处理,直接将输入当作输出 在 ES 中的名称为 keyword |
Pattern Analyzer | 通过正则表达式进行分词,默认为\W+非字符分隔,然后会进行转小写处理 在 ES 中的名称为 pattern |
6.创建文档 从控制器再到实现类的代码略
// integer创建文档数 insertBatch批量创建文档 list创建数据
integer = xxDao.insertBatch(xxList);
7.查询
//配置Es查询条件 eq代表= 条件构造器官方文档自提 以下说些常用的
LambdaEsQueryWrapper<【实体类】> wrapper = new LambdaEsQueryWrapper<>();
wrapper.eq(【实体类】::【实体类属性】,"【搜索关键词】");
wrapper.limit(50);//分页
wrapper.highLight(【实体类】::【实体类属性】);//高亮字段
wrapper.match(【实体类】::【实体类属性】, "【搜索关键词】");//分词匹配
//EE据动态查询条件,查询全部记录
List<【实体类】> list = xxDao.selectList(wrapper);
三、拓展使用
使用EE封装好的方法获取不到分数,如果想获取ES中的分数,EE表示需要使用原生对象SearchResponse实现
故在原来的基础上,拼接分数
首先获取分数 map
//wrapper条件与之前想的一致
SearchResponse response = searchProductDao.search(wrapper);
//意思就是获取response 中的hits 然后遍历筛选放到map中
float maxScore = response.getHits().getMaxScore();
SearchHit[] hits = response.getHits().getHits();
Map<String, Float> hitMap = new HashMap<>();
for (SearchHit hit : hits) {
if (hit.getScore()>maxScore*0.9){
hitMap.put(hit.getId(), hit.getScore());
}
}
然后在原来的list去重
//然后获取map中的键值,就是我自定义的ID
List<String> hitList = hitMap.entrySet().stream().map(Map.Entry::getKey).collect(Collectors.toList());
//去重 collect也是一个ID列表(原来查询的50条数据的list) 我想筛选分数大于90%的数据
collect.retainAll(hitList);
最后for循环拼接 分数
for (【实体类】 d : list){
for (String h : hitMap.keySet()){
if (d.getId().equals(h)){
d.setScore(hitMap.get(h));
}
}
}
根据EE高亮获取分词查询的词频 并且排序
1.实体类中定义字段
/**
* 高亮返回值被映射的字段
*/
@HighLightMappingField("【ES查询需要高亮字段】")
private String highlightContent;
@TableField(exist = false)
private Integer highlightCount;
PS:注意一定要添加查询高亮条件@HighLightMappingField(“【ES查询需要高亮字段】”)与wapper的字段要一直
2.计算查询结果的词频 list是查询出来的列表 "em"是默认高亮标签,通过计算标签数就可以获取词频
for (【实体类】 l : list) {
String highlightContent = l.getHighlightContent();
String high ="";
if (StringUtils.isBlank(highlightContent)) {
l.setHighlightCount(0);
} else {
int count = (highlightContent.length()-highlightContent.replace(high,"").length())/high.length();
l.setHighlightCount(count);
}
}
3.排序 词频降序 如果想升序把.reversed()删除即可
list.stream().sorted(Comparator.comparing(【实体类】::getHighlightCount).reversed()).collect(Collectors.toList());
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)