Elasticsearch:RestHighLevelClient实现搜索、分页、排序、高亮

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

ElasticSearch搜索引擎👀️

1.引入依赖

<dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

2.自定义搜索DTO

/**
 * es搜索引擎参数
 *
 * @author xzx
 * @date 2022/10/4
 */
@Data
@Accessors(chain = true)
public class SearchReqDto {

   /**
    * 当前页码
    */
   private Integer pageNum = 1;
   /**
    * 页数
    */
   private Integer pageSize = 10;

   /**
    * 索引库名称
    */
   private String indices;
   /**
    * 关键词
    */
   private String keyword;

   /**
    * 排序字段
    */
   private String orderByColumn = "createdTime";
   /**
    * asc or desc
    */
   private String isAsc = "asc";
   /**
    * 高亮字段
    */
   private String[] highlightFields;
}

3.封装工具类、实现分页、高亮、排序

/**
 * elasticsearch配置类
 *
 * @author xzx
 * @date 2022/10/2
 */
@Configuration
public class ESConfig {

   @Value("${elasticsearch.url}")
   private String elasticsearchUrl;

   @Bean(name = "RestHighLevelClient")
   public RestHighLevelClient restHighLevelClient() {
      return new RestHighLevelClient(RestClient.builder(
              HttpHost.create(elasticsearchUrl)
      )
      );
   }
}
import java.io.IOException;

/**
 * elasticsearch 封装类
 *
 * @author xzx
 * @date 2022/10/4
 */
@Component
public class EsClient {

   @Autowired
   private RestHighLevelClient restHighLevelClient;

   /**
    * 搜索并完成分页、高亮、排序
    *
    * @param req
    * @param beanClass
    * @return responseResult
    * @throws IOException
    */
   public <T> ResponseResult findObject(SearchReqDto req, Class<T> beanClass) throws IOException {
      if (ObjUtil.isNull(req) || StringUtil.isBlank(req.getIndices())) {
         return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
      }
      if (StringUtil.isBlank(req.getOrderByColumn())) {
         req.setOrderByColumn("createdTime");
      }
      List<Object> resultList = null;
      Map<Object, Object> resultMap = new HashMap<>();
      SearchHits hits = queryBuilder(req);
      T bean = null;
      resultList = new ArrayList<>();
      //遍历查询结果并接收
      for (SearchHit searchHit : hits) {
         /**
          * 关键词为空或者没有高亮字段,不需要再处理
          */
         if (StringUtil.isBlank(req.getKeyword()) || ArrayUtil.isEmpty(req.getHighlightFields())) {
            bean = JSONUtil.toBean(searchHit.getSourceAsString(), beanClass);
         } else {
            bean = replaceAttr(searchHit, req.getHighlightFields(), beanClass);
         }
         if (ObjUtil.isNotNull(bean)) {
            resultList.add(bean);
         }
      }
      resultMap.put("total", resultList.size());
      resultMap.put("record", resultList);
      return ResponseResult.okResult(resultMap);
   }

   /**
    * 构造查询条件,获取原生返回数据
    *
    * @param req 查询条件
    * @return SearchHit
    * @throws IOException
    */
   public SearchHits queryBuilder(SearchReqDto req) throws IOException {
      SearchSourceBuilder builder = new SearchSourceBuilder();
      BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
      HighlightBuilder highlightBuilder = new HighlightBuilder();

      int pageNum = req.getPageNum() > 0 ? req.getPageNum() : 1;
      int pageSize = req.getPageSize() > 0 ? req.getPageSize() : 10;
      //设置分页
      builder.from((pageNum - 1) * pageSize);
      builder.size(pageSize);

      //设置高亮
      highlightBuilder.field("*"); //所有的字段都高亮
      highlightBuilder.requireFieldMatch(false);//如果要多个字段高亮,这项要为false
      highlightBuilder.preTags("<font color='red'>").postTags("</font'>")
              .fragmentSize(800000)//下面这两项,如果你要高亮如文字内容等有很多字的字段,必须配置,不然会导致高亮不全,文章内容缺失等;  最大高亮分片数
              .numOfFragments(0);//从第一个分片获取高亮片段
      builder.highlighter(highlightBuilder);

      //模糊查询
      if (StringUtil.isBlank(req.getKeyword())) {
         boolQueryBuilder.should(QueryBuilders.matchAllQuery());
      } else {
         boolQueryBuilder.should(QueryBuilders.matchQuery("all", req.getKeyword()));
      }
      //对查询结果进行排序
      SortOrder order = SortOrder.ASC;
      if (SortOrder.DESC.name().equalsIgnoreCase(req.getIsAsc())) {
         order = SortOrder.DESC;
      }
      builder.query(boolQueryBuilder).sort(req.getOrderByColumn(), order);
      SearchRequest searchRequest = new SearchRequest(req.getIndices());
      searchRequest.source(builder);
      SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
      return searchResponse.getHits();
   }


   /**
    * 将高亮字段替换
    *
    * @param searchHit 查询结果
    * @param attrs     字段名
    * @return T
    */
   private <T> T replaceAttr(SearchHit searchHit, String[] attrs, Class<T> beanClass) {
      T bean = null;
      Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
      for (String field : attrs) {
         HighlightField hField = highlightFields.get(field);
         if (hField != null) {
            //替换高亮字段
            Text[] fragments = hField.fragments();
            StringBuilder text = new StringBuilder();
            for (Text textGet : fragments) {
               text.append(textGet);
            }
            //对象的值只能读一次,否则会被覆盖
            if (ObjUtil.isNull(bean)) {
               //转换数据类型
               bean = JSONUtil.toBean(searchHit.getSourceAsString(), beanClass);
            }
            //设置对象的属性值
            ReflectUtil.invokeSetter(bean, field, text.toString());
         }
      }
      return bean;
   }
}

反射工具类ReflectUtil是我自定义的,原理是反射,可以引入hutool的工具包,同样也可以实现该结果

Elasticsearch:RestHighLevelClient实现搜索、分页、排序、高亮文章来源地址https://www.toymoban.com/news/detail-513855.html


到了这里,关于Elasticsearch:RestHighLevelClient实现搜索、分页、排序、高亮的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索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日
    浏览(41)
  • Spring Boot 集成 ElasticSearch:实现模糊查询、批量 CRUD、排序、分页和高亮功能

    文章来源:https://blog.csdn.net/qq_52355487/article/details/123805713 在pom.xml里加入如下依赖 非常重要:检查依赖版本是否与你当前所用的版本是否一致,如果不一致,会连接失败! 1.创建、判断存在、删除索引 2.对文档的CRUD 创建文档: 注意:如果添加时不指定文档ID,他就会随机生成

    2024年02月04日
    浏览(31)
  • spring boot使用elasticsearch分词,排序,分页,高亮简单示例

    记,写一个简单的es分词demo,es版本6.8.12 如果使用es7有些方法可能会有所改变,请参考7的文档 es安装教程:http://t.csdn.cn/BSh12 怎么简单怎么来 商品名称加了 @Field(type = FieldType.Text, analyzer = “ik_max_word”) 会自动分词 分页处理 3.2.1 分词 当输入衣服鞋子的时候会将分

    2024年02月08日
    浏览(27)
  • 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日
    浏览(37)
  • ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等)

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

    2024年02月12日
    浏览(43)
  • Elasticsearch (ES) 搜索引擎: 搜索功能:搜索分页、搜索匹配、全文搜索、搜索建议、字段排序

    原文链接:https://xiets.blog.csdn.net/article/details/132348920 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) ES 搜索 API 官网文档:Search APIs 先创建一个索引,并写入一些文档用于搜索示例: 写入一些文档示例: 官网API:The _source option 搜索结果中的文档数据封装

    2024年02月08日
    浏览(44)
  • PHP elasticsearch 条件过滤、排序、高亮实现

    php在做搜索引擎时,进程要对结果进行筛选,所以我们这里记录一下elasticsearch 条件过滤、排序、高亮实现。在创建索引时如果使用了mapping映射,请将要过滤和排序的字段index设置为true ok,搞定! php写搜索时注意:多个筛选条件时,term、range外面还有一层[],高亮需指定字段,

    2023年04月21日
    浏览(27)
  • 【Elasticsearch】SpringBoot整合ES实现搜索功能 | 高亮显示

    先看代码: controller: serviceImpl: 小结 : 1、添加ES场景启动器 2、yaml配置ES 3、准备需要用到的变量 注:还有一个注入的RestHighLevelClient 结构如下: 具体调用的方法以及设置页码等参看代码。 加断点查看对应searchResponse数据结构: HighlightFields的数据结构: 对照kinaba结果: 3、根

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

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

    2024年02月06日
    浏览(31)
  • Es elasticsearch 二十 站内搜索示例 高亮内容 java springboot 实现

    目录 实现思路 代码 全依赖 参数对象 搜索实现代码全代码 日志 重点 权重 分页 入参高亮数据处理 返回出参数据处理 构建请求 请求体设置搜索字段 返回数据解析获取高亮 高亮通过设置标签和class  前端设置class字体颜色 也可直接写在后端   全依赖 参数对象 搜索实现代码

    2024年02月02日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包