spring boot使用elasticsearch分词,排序,分页,高亮简单示例

这篇具有很好参考价值的文章主要介绍了spring boot使用elasticsearch分词,排序,分页,高亮简单示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记,写一个简单的es分词demo,es版本6.8.12

如果使用es7有些方法可能会有所改变,请参考7的文档

es安装教程:http://t.csdn.cn/BSh12

1. 创建ES实体

怎么简单怎么来

@Data
@Document(indexName = "goods")
public class GoodsEsItem implements Serializable {
    //主键
    @Id
    private Long id;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")  //商品名
    private String name;
    
    private String category;


    @Field(type = FieldType.Date)
    private Date create_time;

    @Field(type = FieldType.Date)
    private Date update_time;

}

2. 创建查询实体

@Data
public class GoodsQueryVo {
    /**
     * 关键字
     */
    private String keyword;

    /**
     * 分类
     */
    private String category;


    /**
     * 当前页
     */
    private Integer current;

    /**
     * 每页大小
     */
    private Integer pageSize;

    /**
     * 排序字段
     */
    private String sfield;

    /**
     * 排序格式asc,desc
     */
    private String sm;
}

3. 查询方法实现

3.1 核心代码

@Override
public Map<String, Object> searchByKeyword(GoodsQueryVo goodsQueryVo) {
    	//构建查询条件
        NativeSearchQueryBuilder queryBuilder = queryBuilder(goodsQueryVo);

        //添加高亮域
        HighlightBuilder.Field field = new HighlightBuilder.
                Field("name").                      //指定的高亮域
                preTags("<span style=\"color:red\">").   //前缀
                postTags("</span>").                      //后缀
                fragmentSize(100);
        queryBuilder.withHighlightFields(field);
        //执行搜索。HighlightResultMapper处理高亮文本
        AggregatedPage<PblGoodsEsItem> results = elasticsearchRestTemplate.queryForPage(queryBuilder.build(), PblGoodsEsItem.class, new HighlightResultMapper());
        //结果集
        Map<String, Object> resultMap = new HashMap<String, Object>();
        resultMap.put("list", results.getContent());
        resultMap.put("total", results.getTotalElements());
        return resultMap;
}

3.2 构建查询条件

商品名称加了 @Field(type = FieldType.Text, analyzer = “ik_max_word”) 会自动分词

private NativeSearchQueryBuilder queryBuilder(GoodsQueryVo goodsQueryVo) {
    //关键字分词
    EsIkResult esIkResult = keywordToken(goodsQueryVo);
    List<String> tokens = esIkResult.getTokens().stream().map(EsIkResult.token::getToken).collect(Collectors.toList());
    //QueryBuilder构建
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

    //多条件组合查询对象
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

    //关键字条件should构建or条件,must构建and条件
    BoolQueryBuilder keywordQuery = QueryBuilders.boolQuery();
    tokens.forEach(e -> {
        keywordQuery.should(QueryBuilders.termQuery("name", e));
    });
	
    //分类条件
    if (!StringUtils.isEmpty(goodsQueryVo.getCategory())) {
        boolQuery.must(QueryBuilders.termQuery("category",goodsQueryVo.getCategory()));
    }
    //这里的关系为(keyword1 or keyword2) and category
    boolQuery.must(keywordQuery);
    //分页
    queryBuilder.withPageable(PageRequest.of(currentPage(goodsQueryVo), goodsQueryVo.getPageSize()));
    //排序
    String sfield = goodsQueryVo.getSfield();
    String sm = goodsQueryVo.getSm();
    if (!StringUtils.isEmpty(sfield) && !StringUtils.isEmpty(sm)) {
        queryBuilder.withSort(
            SortBuilders.fieldSort(sfield)   //排序域
            .order(SortOrder.valueOf(sm)));  //排序方式
    }
    return queryBuilder.withQuery(boolQuery);
}

分页处理

public int currentPage(GoodsQueryVo goodsQueryVo) {
    try {
        Object currentPage = goodsQueryVo.getCurrent();
        return Integer.parseInt(currentPage.toString()) > 0 ? Integer.parseInt(currentPage.toString()) - 1 : 0;
    } catch (Exception e) {
        return 0;
    }
}

3.2.1 关键词分词

当输入衣服鞋子的时候会将关键字分为衣服,鞋子去查询

@Data
public class EsIkResult {

    private List<token> tokens;

    @Data
    public static class token{
        private String token;

        @JSONField(name = "start_offset")
        private Integer startOffset;

        @JSONField(name = "end_offset")
        private Integer endOffset;

        private String type;

        private Integer position;
    }
}

HttpUtil是自己封装的http请求类,可以根据自己的方式去发出请求文章来源地址https://www.toymoban.com/news/detail-475419.html

private EsIkResult keywordToken(GoodsQueryVo goodsQueryVo) {
    HashMap<String, Object> params = new HashMap<>();
    params.put("analyzer", "ik_max_word");
    params.put("text", goodsQueryVo.getKeyword());
    return HttpUtil.post("http://localhost:9200/_analyze?pretty", params, EsIkResult.class);
}

3.3 高亮处理

高亮处理mapper,处理高亮数据,复制用即可,不需要记

public class HighlightResultMapper extends DefaultResultMapper {
    /***
     * 处理结果集
     */
    @Override
    public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
        //所有数据
        for (SearchHit hit : response.getHits()) {
            //当前单条数据
            Map<String, Object> sourceMap = hit.getSourceAsMap();
            //高亮数据
            for (Map.Entry<String, HighlightField> entry : hit.getHighlightFields().entrySet()) {
                String key = entry.getKey();
                if (sourceMap.containsKey(key)) {
                    Text[] fragments = entry.getValue().getFragments();
                    sourceMap.put(key, transTextArrayToString(fragments));
                }
            }
            hit.sourceRef(new ByteBufferReference(ByteBuffer.wrap(JSONObject.toJSONString(sourceMap).getBytes())));
        }
        return super.mapResults(response, clazz, pageable);
    }

    /***
     * 拼接数据碎片
     */
    private String transTextArrayToString(Text[] fragments) {
        if (null == fragments) {
            return "";
        }
        StringBuffer buffer = new StringBuffer();
        for (Text fragment : fragments) {
            buffer.append(fragment.string());
        }
        return buffer.toString();
    }
}

添加高亮,在上面·searchByKeyword方法有写到

此处会将name字段含有关键字的文本替换成<span style=“color:red”> 包含,前端用html回显即可

示例,搜索衣服

spring boot使用elasticsearch分词,排序,分页,高亮简单示例

//添加高亮域
HighlightBuilder.Field field = new HighlightBuilder.
        Field("name").                      //指定的高亮域
        preTags("<span style=\"color:red\">").   //前缀
        postTags("</span>").                      //后缀
        fragmentSize(100);
queryBuilder.withHighlightFields(field);
//执行搜索。HighlightResultMapper处理高亮文本
AggregatedPage<PblGoodsEsItem> results = elasticsearchRestTemplate.queryForPage(queryBuilder.build(), PblGoodsEsItem.class, new HighlightResultMapper());

4.完整查询代码展示

ps:

高亮处理代码上方已给出,此处只给出搜索代码

HttpUtil是自己封装的http请求类,可以根据自己的方式去发出请求

@Service
public class GoodsEsServiceImpl implements GoodsEsService {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Override
    public Map<String, Object> searchByKeyword(GoodsQueryVo goodsQueryVo) {
        //构建查询条件
        NativeSearchQueryBuilder queryBuilder = queryBuilder(goodsQueryVo);

        //添加高亮域
        HighlightBuilder.Field field = new HighlightBuilder.
                Field("name").                      //指定的高亮域
                preTags("<span style=\"color:red\">").   //前缀
                postTags("</span>").                      //后缀
                fragmentSize(100);
        queryBuilder.withHighlightFields(field);
        //执行搜索。HighlightResultMapper处理高亮文本
        AggregatedPage<PblGoodsEsItem> results = elasticsearchRestTemplate.queryForPage(queryBuilder.build(), PblGoodsEsItem.class, new HighlightResultMapper());
        //结果集
        Map<String, Object> resultMap = new HashMap<String, Object>();
        resultMap.put("list", results.getContent());
        resultMap.put("total", results.getTotalElements());
        return resultMap;
    }

    private NativeSearchQueryBuilder queryBuilder(GoodsQueryVo goodsQueryVo) {
        //关键字分词
        EsIkResult esIkResult = keywordToken(goodsQueryVo);
        List<String> tokens = esIkResult.getTokens().stream().map(EsIkResult.token::getToken).collect(Collectors.toList());
        //QueryBuilder构建
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

        //多条件组合查询对象
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

        //关键字条件should构建or条件,must构建and条件
        BoolQueryBuilder keywordQuery = QueryBuilders.boolQuery();
        tokens.forEach(e -> {
            keywordQuery.should(QueryBuilders.termQuery("name", e));
        });

        //分类条件
        if (!StringUtils.isEmpty(goodsQueryVo.getCategory())) {
            boolQuery.must(QueryBuilders.termQuery("category",goodsQueryVo.getCategory()));
        }
        //这里的关系为(keyword1 or keyword2) and category
        boolQuery.must(keywordQuery);
        //分页
        queryBuilder.withPageable(PageRequest.of(currentPage(goodsQueryVo), goodsQueryVo.getPageSize()));
        //排序
        String sfield = goodsQueryVo.getSfield();
        String sm = goodsQueryVo.getSm();
        if (!StringUtils.isEmpty(sfield) && !StringUtils.isEmpty(sm)) {
            queryBuilder.withSort(
                    SortBuilders.fieldSort(sfield)   //排序域
                            .order(SortOrder.valueOf(sm)));  //排序方式
        }
        return queryBuilder.withQuery(boolQuery);
    }

    public int currentPage(GoodsQueryVo goodsQueryVo) {
        try {
            Object currentPage = goodsQueryVo.getCurrent();
            return Integer.parseInt(currentPage.toString()) > 0 ? Integer.parseInt(currentPage.toString()) - 1 : 0;
        } catch (Exception e) {
            return 0;
        }
    }

    private EsIkResult keywordToken(GoodsQueryVo goodsQueryVo) {
        HashMap<String, Object> params = new HashMap<>();
        params.put("analyzer", "ik_max_word");
        params.put("text", goodsQueryVo.getKeyword());
        return HttpUtil.post("http://localhost:9200/_analyze?pretty", params, EsIkResult.class);
    }
}

到了这里,关于spring boot使用elasticsearch分词,排序,分页,高亮简单示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 整合ElasticSearch实现模糊查询,批量CRUD,排序,分页,高亮

    准备一个空的SpringBoot项目 写入依赖 注意你的SpringBoot和你的es版本,一定要对应,如果不知道的可以查看这篇文章:https://blog.csdn.net/u014641168/article/details/130386872 我的版本是2.2.6,所以用的ES版本是 6.8.12,安装es请看这篇文章:https://blog.csdn.net/u014641168/article/details/130622430 查看

    2024年02月08日
    浏览(53)
  • ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮)

    目录 一、基于 JavaRestClient 查询文档 1.1、查询 API 演示 1.1.1、查询基本框架 DSL 请求的对应格式 响应的解析 1.1.2、全文检索查询 1.1.3、精确查询 1.1.4、复合查询 1.1.5、排序和分页 1.1.6、高亮 1.1.1、查询基本框架 接下里通过一个 match_all 查询所有,来演示以下基本的 API. 由上可

    2024年02月07日
    浏览(49)
  • Elasticsearch 核心技术(九):搜索结果处理(分页、排序、指定返回字段、去重、高亮显示)

    ❤️ 博客主页:水滴技术 🚀 支持水滴: 点赞 👍 + 收藏 ⭐ + 留言 💬 🌸 订阅专栏:大数据核心技术从入门到精通

    2023年04月13日
    浏览(85)
  • ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等)

    查询所有:查询所有数据,一般在测试时使用。march_all,但是一般显示全部,有一个分页的功能 全文检索(full text)查询:利用分词器对用户的输入内容进行分词,然后去倒排索引库匹配。例如: match_query mutil_match_query 精确查询:根据精确词条值查询数据,一般查找的时k

    2024年02月12日
    浏览(52)
  • 微服务分布式搜索引擎 ElasticSearch 搜索结果处理 排序、分页与高亮

    本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 搜索结果处理 搜索的结果可以按照用户指定的方式去处理或展示。 elasticsearch默认是根据相关度算分(_score)来排序,但是也支

    2024年02月02日
    浏览(59)
  • 在Spring Boot中整合Elasticsearch并实现高亮搜索

    本文详细介绍了如何在Spring Boot项目中整合Elasticsearch,实现高亮搜索功能。通过添加依赖、配置Spring Boot、为实体类添加注解,以及在Service层实现高亮搜索,读者能够了解如何在实际项目中利用Spring Boot Data Elasticsearch来操作Elasticsearch并实现高亮搜索。验证示例演示了如何使用RESTful API端点来搜索并获取包含高亮字段的用户列表,为读者提供了实际应用的参考。这篇文章将帮助读者轻松掌握Spring Boot与Elasticsearch的整合方法,从而为项目增加强大的搜索功能。

    2024年02月06日
    浏览(42)
  • [Spring Boot]12 ElasticSearch实现分词搜索功能

    我们在使用搜索功能的时候,有时,为了使搜索的结果更多更广,比如搜索字符串“领导力”,希望有这些组合的结果(领导力、领导、领、导、力)都要能够全部展示出来。 这里我们引入ElasticSearch结合分词插件,来实现这样的搜索功能。 比如:一款app需要对“课程”进行

    2024年02月03日
    浏览(42)
  • 知识点13--spring boot整合elasticsearch以及ES高亮

    本章知识点沿用知识点12的项目,介绍如何使用spring boot整合ES,没有ES的去我主页 各类型大数据集群搭建文档--大数据原生集群本地测试环境搭建三 中可以看到ES如何搭建 不管你有没有ES,最好是没有,因为一定要知道一点,一定要去官网查一下你当前用的spring boot data es的版

    2024年02月12日
    浏览(55)
  • ElasticSearch 学习9 spring-boot ,elasticsearch7.16.1实现中文拼音分词搜索

    一、elasticsearch官网下载:Elasticsearch 7.16.1 | Elastic 二、拼音、ik、繁简体转换插件安装 ik分词:GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary. 拼音分词:GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is

    2024年01月22日
    浏览(51)
  • springboot+Elasticsearch实现word,pdf,txt内容抽取并高亮分词全文检索

    文章目录 需求 一、环境 二、功能实现 1.搭建环境 2.文件内容识别 三.代码         产品希望我们这边能够实现用户上传PDF,WORD,TXT之内得文本内容,然后用户可以根据附件名称或文件内容模糊查询文件信息,并可以在线查看文件内容         项目开发环境:           

    2023年04月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包