SpringBoot项目集成Easy-Es工具类使用总结

SpringBoot项目集成Easy-Es工具类使用总结,第1张

SpringBoot项目集成Easy-Es工具类使用总结 一、EE介绍

项目中使用到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());

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/875866.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)