springboot——集成elasticsearch进行搜索并高亮关键词

这篇具有很好参考价值的文章主要介绍了springboot——集成elasticsearch进行搜索并高亮关键词。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.elasticsearch概述

3.springboot集成elasticsearch

4.实现搜索并高亮关键词


1.elasticsearch概述

(1)是什么:

Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。

Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但Lucene 只是一个基于java下的库,需要使用 Java 并要将其集成到你的应用中才可进行使用。而Elasticsearch 则是基于Lucene 下实现的开源搜索引擎。

Elasticsearch 基于分布式进行实时文件存储,每个字段都被索引并可被搜索,并可进行实时分析。同事由于基于分布式,可以扩展到上百台服务器,处理PB级结构化或非结构化数据。

(2)核心概念:

elasticsearch可归类于NoSQL的一种,其主要包含index(索引)、type(类型,elasticsearch 7.x后已被舍弃)、Document(文档)、Fields(字段)。

类比于MySQL如下:

springboot——集成elasticsearch进行搜索并高亮关键词

其实现的核心在于倒排索引: 指的是将文档内容中的单词作为索引,将包含该词的文档 ID 作为记录。

一般的sql中都是正排索引,即以表中的唯一标识id作为索引,通过主键索引找到文档其他内容(具体请参考mysql存储结构)。

而elasticsearch通过关键字作为索引反向找到文档ID,可以高效的实现全文检索。

如我们有以下两条记录:

id content writer
1 这是一条测试数据,测试elasticsearch seven
2 这是第二条、测试数据,试一下elasticsearch搜索 seven

以上两条数据,在mysql中id为主键,当我们以elasticsearch以关键词搜索去搜查所有和elasticsearch有关的content时,在没有为content建索引的情况下,无法走主键索引,mysql会进行全表检索,效率一般。

而elasticsearch中会为content建立倒排索引,根据content找到对应的id,返回搜索结果,效率快鱼mysql。并且,整个搜索过程中我们不需要做任何文本的模糊匹配。

(3)应用场景:

ElasticSearch作为一个便于使用的分布式全文搜索引擎,常被用于各种搜索场景中:

  • 维基百科,百度等搜索引擎,对关键词和内容概要进行匹对,并对搜索的关键词进行高亮。
  • 电商平台,对关键词和商品名称、标题进行匹配,并对对搜索的关键词进行高亮。
  • 论坛,对关键词和帖子内容及评论等快速匹配,并对搜索关键词进行高亮。

总之言之, ElasticSearch是一个优秀的检索工具,可以对各类内容进行快速检索,并返回结果:

springboot——集成elasticsearch进行搜索并高亮关键词

(检索关键词并进行高亮)

一般情况我们会在数据存入数据库前,把需要检索的字段作为ElasticSearch的索引和需要返回的数据存入ElasticSearch(比如电商平台达到商品标题),然后在搜索时使用ElasticSearch进行全文检索,快速返回相关结果。

3.springboot集成elasticsearch

下面对springboot集成elasticsearch进行演示:

pom依赖文件:

    <properties>
        <java.version>1.8</java.version>
        <elasticsearch.version>7.6.1</elasticsearch.version>
    </properties>

    <dependencies>
        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.70</version>
        </dependency>
        <!-- ElasticSearch -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <!-- web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- lombok 需要安装插件 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

此处需要注意的是springboot自带的ElasticSearch版本为6.8.5 ,如果你使用的是其他版本的ElasticSearch请注意指定版本号。

config配置文件,对ElasticSearch进行连接:

@Configuration
public class ElasticSearchConfig {
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("127.0.0.1",9200,"http")
                )
        );
        return client;
    }
}

至此,我们皆可以通过 RestHighLevelClient 对ElasticSearch进行使用

4.实现搜索并高亮关键词

下面对 ElasticSearch进行使用,进行查询并高亮关键词。

首先我们建立索引:user,并存入以下数据:

springboot——集成elasticsearch进行搜索并高亮关键词

然后,我们在业务类编写查询方法:

//查询
    public List<User> searchUserByKeyword(String keyword,int pageNo,int pageSize) throws IOException {
        if (pageNo<=1){
            pageNo=1;
        }
        //条件查询
        SearchRequest searchRequest = new SearchRequest("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //分页
        searchSourceBuilder.from(pageNo);
        searchSourceBuilder.size(pageSize);

        //匹配关键词(类似于模糊查询)
        //MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("sign",keyword);
        //组合查询
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        //and查询,所有条件都要符合;    or查询可以使用queryBuilder.should
        queryBuilder.must(QueryBuilders.matchQuery("sign",keyword));
        queryBuilder.must(QueryBuilders.matchQuery("statue","use"));
        //精确匹配
        //TermQueryBuilder queryBuilder = QueryBuilders.termQuery("sign",keyword);
        searchSourceBuilder.query(queryBuilder);

        //设置高亮
        //highlightBuilder.requireFieldMatch(false);   //只需要高亮第一个
        searchSourceBuilder.highlighter(new HighlightBuilder().field("sign"));

        //执行
        searchRequest.source(searchSourceBuilder);
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //解析结果
        List<User> list = new ArrayList<>();
        for (SearchHit hit: response.getHits().getHits()){
            //解析高亮字段
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField sign = highlightFields.get("sign");
            //获取原字段
            Map<String, Object> oldUser = hit.getSourceAsMap();
            //将高亮替换原字段内容
            StringBuilder stringBuilder = new StringBuilder();
            if (sign!=null){
                Text[] texts = sign.fragments();
                for (Text t:texts){
                    stringBuilder.append(t);
                }
                log.info("替换:"+stringBuilder);
                oldUser.put("sign",stringBuilder.toString());
            }

            User user = JSONObject.parseObject(hit.getSourceAsString(),User.class);
            user.setSign(oldUser.get("sign").toString());
            list.add(user);
        }
       return list;
    }

ElasticSearch的match配置是拆字匹配,即关键词为“测试”,那么会查询出所有目标字段中包含“测”和“试”任一字符的结果;若为“java”则不会对字母进行拆分,会保持整个单词完整。

上述代码需要注意的是,高亮的字段必须是查询的字段,才可以对查询的关键词进行高亮处理,否则高亮字段会为空。

编写controller进行测试:

@RestController
public class SearchController {

    @Resource
    private SearchService searchService;

    @GetMapping("/test")
    public List<User> test(@RequestParam("keyword")String keyword) throws IOException {
        return searchService.searchUserByKeyword(keyword,0,5);
    }
}

结果:

springboot——集成elasticsearch进行搜索并高亮关键词

成功查询所有sign包含java关键词且statue为use的用户,并对java关键词进行高亮(em标签,需要使用html进行解析)。

拓展:

(1)ElasticSearch还可以对搜索结果进行排序:

searchSourceBuilder.sort("age");

上述代码即根据age字段对搜索结果进行排序。

(2)过滤查询条件:

        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        //过滤statue!=use的数据
        queryBuilder.filter(QueryBuilders.matchPhraseQuery("statue","use"));
        //过滤age不大于20的数据
        queryBuilder.filter(QueryBuilders.rangeQuery("age").gt(20));

具体还有很多查询条件,具体可参考ElasticSearch官网文档。文章来源地址https://www.toymoban.com/news/detail-419426.html

到了这里,关于springboot——集成elasticsearch进行搜索并高亮关键词的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • SpringBoot集成Elasticsearch搜索引擎

    Elasticsearch是一个基于Lucene的搜索引擎,它提供了实时、可扩展和可伸缩的搜索功能。Spring Boot是一个用于构建新Spring应用的起点,它旨在简化开发人员的工作,使其能够快速地构建可扩展的、可维护的应用程序。 在现代应用程序中,搜索功能是非常重要的。它可以帮助用户快

    2024年02月19日
    浏览(38)
  • Elasticsearch 搜索测试与集成Springboot3

    Elasticsearch是专门做 搜索 的,它非常擅长以下方面的问题 Elasticsearch对模糊搜索非常擅长(搜索速度很快) 从Elasticsearch搜索到的数据可以根据 评分 过滤掉大部分的,只要返回评分高的给用户就好了(原生就支持排序) 没有那么准确的也能搜出相关的结果(能匹配有相

    2024年01月22日
    浏览(34)
  • springboot集成elasticsearch,实现搜索提示补全功能

    注:在此之前需要下载elasticsearch以及拼音分词器。可以查看这篇文章,免费下载,下载完直接解压就行。 https://download.csdn.net/download/weixin_47874230/86514890 spring-data-elasticsearch版本需要与springboot版本对应,此处使用springboot版本为2.2.13.RELEASE

    2024年02月09日
    浏览(28)
  • Elasticsearch的关键词搜索

    返回给前端的实体类 es对应的实体类 前端传递的搜索参数实体类 controller层 service层接口 service实现类 Springboot启动类

    2023年04月08日
    浏览(38)
  • ElasticSearch实战之项目搜索高亮

    为满足 ElasticSearch 可在项目中实现搜索高亮,我们需要先做一些前情配置 导入 ElasticSearch 依赖 修改 propertise 配置 构建一个搜索类对象,这里假设我们存在一个搜索对象为 Content ,其中我们要进行查询的字段是 title 同时,假设我们拥有 ListContent 数据集合,至此,我们做好了

    2024年04月22日
    浏览(27)
  • elasticsearch搜索关键字高亮显示

    使用 elasticsearch 时,有一个很常见的需求是,能在页面上将搜索出的结果中属于的文字,进行高亮显示。 elasticsearch 对这个做了一定的支持,它能查询结果的基础上,额外返回需要高亮显示的整个文本,至于具体你想怎么用它,需要根据业务自行实现。 使用 k

    2023年04月08日
    浏览(39)
  • 深度学习实战20(进阶版)-文件智能搜索系统,可以根据文件内容进行关键词搜索,快速找到文件

    大家好,我是微学AI,今天给大家带来深度学习实战项目-文件智能搜索系统,文件智能搜索系统是一种能够帮助用户通过文件的内容快速搜索和定位文件的软件系统。 随着互联网和数字化技术的普及,数据和信息呈现爆炸式增长的趋势,文件管理和搜索变得越来越困难。传统

    2024年02月13日
    浏览(36)
  • ElasticSearch系列七:ElasticSearch搜索技术深入讲解之高亮

    1.高亮显示         在搜索中,经常需要对搜索做高亮显示,高亮显示也有其常用的参数,在这个案例中做一些常用参数的介绍。假如现在搜索cars索引中remark字段中包含“大众”的document。并对“XX”做高亮显示,高亮效果使用html标签span,并设定字体为红色

    2023年04月09日
    浏览(56)
  • Elasticsearch:RestHighLevelClient实现搜索、分页、排序、高亮

    1.引入依赖 2.自定义搜索DTO 3.封装工具类、实现 分页、高亮、排序 反射工具类 ReflectUtil 是我自定义的,原理是反射,可以引入hutool的工具包,同样也可以实现该结果

    2024年02月11日
    浏览(33)
  • 双方案-基于Mysql 与 ElasticSearch实现关键词提示搜索与全文检索

    就喜欢搞这种不需要怎么费劲的东西,只需要把思路阐述清楚,随笔性质的博文,顺手啊,几乎不用改定就可以当博文发布出去。 那么,这里的话我们要做的就是实现这个的一个搜索功能,这个前端我就不说了,实现起来起来其实还是容易的,就是费劲。我们主要关注

    2024年01月18日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包