ElasticSearch实战之项目搜索高亮

这篇具有很好参考价值的文章主要介绍了ElasticSearch实战之项目搜索高亮。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ElasticSearch实战之项目搜索高亮,ElasticSearch,SpringBoot,elasticsearch,大数据,SpringBoot

1. 前情配置


为满足ElasticSearch可在项目中实现搜索高亮,我们需要先做一些前情配置

  1. 导入ElasticSearch依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
  1. 修改propertise配置
server.port=9090
spring.thymeleaf.cache=false
# 保证url可以输入中文,防止乱码
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
  1. 构建一个搜索类对象,这里假设我们存在一个搜索对象为Content,其中我们要进行查询的字段是title
@AllArgsConstructor
@NoArgsConstructor
@Data
@Component
public class Content {
    private String title;
    private String img;
    private String price;
}

同时,假设我们拥有List<Content>数据集合,至此,我们做好了所有的前情准备


2、数据操作


2.1 操作API


我们拥有List<Content>数据集合,我们要将其插入到es

步骤分为三步:判断索引是否存在 -> 索引不存在则创建索引 -> 索引存在则插入文档

则数据操作的API分为三个,我们一一实现

API(1):判断索引是否存在

public boolean existIndex(String indexName) throws IOException {
    GetIndexRequest request = new GetIndexRequest(indexName);
    boolean isExists = client.indices().exists(request, RequestOptions.DEFAULT);
    return isExists;
}

API(2):创建索引

这里的indexName利用jd_goods传入,即我们创建的索引名称为jd_goods

public boolean createIndex(String indexName) throws IOException {
    CreateIndexRequest request = new CreateIndexRequest(indexName);
    CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
    return response.isAcknowledged();
}

API(3):批量插入数据

这里的indexName利用jd_goods传入,即我们将的List<Content>数据插入到jd_goods

public boolean bulkAddDoc(String indexName, List<Content> listContent) throws IOException {
    //判断是否存在索引
    if (indexService.existIndex()){
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");
        //存入数据
        for (Content content : listContent) {
          bulkRequest.add(new IndexRequest(indexName)
          .source(JSON.toJSONString(content), XContentType.JSON));
        }
        //执行请求
        BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        //不失败表示插入成功
        return !bulkResponse.hasFailures();
    }
    return false;
}

2.2 数据入库


整合上述方法,我们可以将List<Content>存入es

public boolean parseContent(String indexName,List<Content> list) throws IOException {
    //1. 某个获取数据的方法
    List<Content> list = function();
    //2. 判断索引是否存在,并且插入数据
    if (!indexService.existIndex(String indexName)){
        indexService.createIndex(String indexName);
    }
    //3. 插入数据
    return docService.bulkAddDoc(String indexName,list);
}

再次查看es,数据已经被插入

ElasticSearch实战之项目搜索高亮,ElasticSearch,SpringBoot,elasticsearch,大数据,SpringBoot

3. 高亮搜索


3.1 方法封装


封装用于搜索的方法,这里指定利用term搜索

//param搜索字段名称 searchWord搜索关键字,from和size用于分页
public List<Map<String, Object>> searchDoc(String indexName, String param, String searchWord, Integer from, Integer size) throws IOException {
    //构建搜索类
    SearchSourceBuilder searchBuilder = new SearchSourceBuilder();
    //匹配查询
    TermQueryBuilder termQuery = QueryBuilders.termQuery(param, searchWord);
    //设置超时
    searchBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

    //高亮
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    //设置高亮的字段
    highlightBuilder.field(param);
    //多个高亮显示
    highlightBuilder.requireFieldMatch(false);
    highlightBuilder.preTags("<span style='color:red'>");
    highlightBuilder.postTags("</span>");
    searchBuilder.highlighter(highlightBuilder);

    //分页
    if (from <= 0){
        from = 0;
    }
    if (size != 0){
        searchBuilder.from(from);
        searchBuilder.size(size);
    }

    //封装搜索
    searchBuilder.query(termQuery);
    //创建查询请求,并将搜索类放入
    SearchRequest request = new SearchRequest(indexName).source(searchBuilder);
    //客户端查询请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);

    //解析结果,第一次getHits()返回了全部的数据,包括版本信息等
    //第二次getHits()返回了数据中的查询对象
    //getSourceAsMap()表示将查询对象转化为map集合,其中键就是属性,值就是属性对应的值
    ArrayList<Map<String, Object>> list = new ArrayList<>();
    for(SearchHit hit:response.getHits().getHits()){
        //使用新的高亮字段,覆盖旧字段
        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
        //获取全部的高亮字段
        Map<String, HighlightField> highlightFields = hit.getHighlightFields();
        HighlightField title = highlightFields.get(param);
        //开始替换,将旧的title值替换为高亮的值
        if (title != null){
            Text[] fragments = title.getFragments();
            StringBuilder newTitle = new StringBuilder();
            for (Text text:fragments){
                newTitle.append(text);
            }
            sourceAsMap.put(param,newTitle);
        }
        //再次添加进去
        list.add(sourceAsMap);
    }
    return list;
}

整合上述方法,假设我们在jd_goods中搜索title字段

public List<Map<String, Object>> searchContent(String indexName, String keyword,Integer from,Integer size) throws IOException {
    return docService.searchDoc("jd_goods","title",keyword,from,size);
}

3.2 高亮搜索


绑定浏览器地址,尝试查询

@GetMapping("/search/{keyword}/{from}/{size}")
public List<Map<String, Object>> searchContent(@PathVariable("keyword") String keyword,
@PathVariable("from") Integer from,@PathVariable("size") Integer size) throws IOException {
    return contentService.searchContent(keyword,from,size);
}

假设我们需要搜索jd_goods中搜索title字段包含java的字段,同时从第1条数据开始获取,获取的数据大小为20

访问浏览器,关键字已经被设置高亮,只需要传递到前端即可

ElasticSearch实战之项目搜索高亮,ElasticSearch,SpringBoot,elasticsearch,大数据,SpringBoot文章来源地址https://www.toymoban.com/news/detail-855374.html

到了这里,关于ElasticSearch实战之项目搜索高亮的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • elasticsearch搜索关键字高亮显示

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

    2023年04月08日
    浏览(52)
  • Elasticsearch实战(五):Springboot实现Elasticsearch电商平台日志埋点与搜索热词

    Elasticsearch实战(一):Springboot实现Elasticsearch统一检索功能 Elasticsearch实战(二):Springboot实现Elasticsearch自动汉字、拼音补全,Springboot实现自动拼写纠错 Elasticsearch实战(三):Springboot实现Elasticsearch搜索推荐 Elasticsearch实战(四):Springboot实现Elasticsearch指标聚合与下钻分析

    2024年02月09日
    浏览(38)
  • Elasticsearch:RestHighLevelClient实现搜索、分页、排序、高亮

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

    2024年02月11日
    浏览(46)
  • elasticsearch使用template搜索多个索引并且高亮返回结果

    由于搜索多个索引没办法以定义好的Entity来接收quey的结果,所以keyword搜索时不能按照以前的方式来直接分页搜索 所以这里选择重写搜索方法来自定义map返回结果,实现手动分页和替换高亮搜索的结果

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

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

    2024年02月06日
    浏览(42)
  • Elasticsearch查询结果高亮操作实战

    在进行搜索时,搜索出的内容中的会显示不同的颜色,称之为高亮 百度搜索\\\"狂飙\\\",如下所示: 或者在淘宝搜索“手机”,如下所示: 我们可以发现搜索的在搜索到的信息上都变成了红色高亮 通过开发者工具查看高亮数据的html代码实现: Elastic

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

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

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

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

    2023年04月13日
    浏览(85)
  • ElasticSearch nested 字段多关键字搜索,高亮全部匹配关键字的处理

    ElasticSearch 版本号: 6.7.0 用户会传入多个去ES查询 ElasticSearch nested 字段 的多个字段,要求在返回的结果中被搜索的字段需要高亮所有匹配的。例如同时通过 上海 和 策划 ,再 工作经历 的列表中的 工作内容 和 公司名称 中搜索。如果有人员的 工作经历 中

    2024年04月22日
    浏览(59)
  • Elasticsearch (ES) 搜索引擎: 文本搜索:分析器/分词器、同义词/停用词、拼音搜索、高亮显示、拼写纠错

    原文链接:https://xiets.blog.csdn.net/article/details/132349032 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) 文本搜索主要指的就是全文搜索,全文搜索是搜索引擎的核心功能,与精确匹配的结构化数据不同,文本(text)数据在构建索引和搜索时都需要进行额外的处

    2024年02月03日
    浏览(58)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包