当前位置: 首页 > article >正文

SpringBoot封装Elasticsearch搜索引擎实现全文检索

一、前言

注:本文实现了Java对Elasticseach的分页检索/不分页检索的封装

ES就不用过多介绍了,直接上代码:

二、实现步骤:

  • 创建Store类(与ES字段对应,用于接收ES数据)
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;

/**
 * indexName               索引名称 理解为数据库名 限定小写
 * type                    理解为数据库的表名称
 * shards                  默认分区数
 * replicas                每个分区默认的备份数
 * refreshInterval         刷新间隔
 * indexStoreType          索引文件存储类型
 **/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = yourIndex, shards = n, replicas = n, refreshInterval = n)
public class Store implements Serializable {

    /**
     * 属性,与ES字段对应
     * 注:@Field注解:
     * 若Java属性名与ES字段名不同,则根据@Field的name属性匹配ES字段
     * 若Java属性名与ES字段名完全相同,则不用加该注解或name属性
     */
    @Field(name = "yourESfield")
    private String yourAttribute;
}
  • Elasticsearch全文检索接口:不分页检索
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Component
public class Elasticsearch{

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    /**
     * 不分页检索
     *
     * @param yourIndex 索引
     * @param builder   搜索条件
     * @param sortField 排序属性
     * @param sortOrder 排序方式
     * @param clazz     返回类
     * @param <T>       泛型
     * @return 分页表格
     */
    @SuppressWarnings("checkstyle:ParameterNumber")
    public <T> List<T> searchListByCond(String yourIndex, BoolQueryBuilder builder, String sortField, SortOrder sortOrder, Class<T> clazz) {
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(builder);
        if (StringUtils.isNotBlank(sortField)) {
            sourceBuilder.sort(sortField, sortOrder);
        }
        SearchRequest request = new SearchRequest(yourIndex);
        request.source(sourceBuilder);
        SearchResponse response = null;
        try {
            response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        } catch (Exception e) {
            log.error("Search Elasticsearch Error!", e);
        }
        if (response == null) {
            return Collections.emptyList();
        }
        return Arrays.stream(response.getHits().getHits()).map(v -> JSON.parseObject(v.getSourceAsString(), clazz)).collect(Collectors.toList());
    }
}
  • Elasticsearch全文检索接口:分页检索
/**
     * 分页检索
     *
     * @param yourIndex 索引
     * @param builder   搜索条件
     * @param page      分页参数(自己封装一个分页类,网上很多,easy)
     * @param sortField 排序属性
     * @param sortOrder 排序方式
     * @param clazz     返回类
     * @param <T>       泛型
     * @return 分页表格
     */
    @SuppressWarnings("checkstyle:ParameterNumber")
    public <T> Page<T> searchPageByCond(String yourIndex, BoolQueryBuilder builder, Page<T> page, String sortField, SortOrder sortOrder, Class<T> clazz) {
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(builder);
        sourceBuilder.from(Math.max(page.getOffset(), 0));
        sourceBuilder.size(page.getLimit());
        if (StringUtils.isNotBlank(sortField)) {
            sourceBuilder.sort(sortField, sortOrder);
        }
        SearchRequest request = new SearchRequest(yourIndex);
        request.source(sourceBuilder);
        SearchResponse response = null;
        try {
            response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        } catch (Exception e) {
            log.error("Search Elasticsearch Error!", e);
        }
        if (response == null) {
            page.setRows(Collections.emptyList());
            page.setTotal(0);
            return page;
        }
        page.setRows(Arrays.stream(response.getHits().getHits()).map(v -> JSON.parseObject(v.getSourceAsString(), clazz)).collect(Collectors.toList()));
        page.setTotal((int) response.getHits().getTotalHits().value);
        return page;
    }

三、总结

  • 本文实现了Java对Elasticsearch搜索引擎全文检索的封装

  • 传入索引、BoolQueryBuilder查询条件(选传)、排序方式(选传)、Store数据接收类

  • 即可完成对Elasticsearch的全文分页检索、不分页检索


http://www.kler.cn/a/146882.html

相关文章:

  • 网络安全之国际主流网络安全架构模型
  • spi 回环
  • 前端处理input框只能输入带小数点的数字
  • android framework ams/wms常见系统日志(main\system\events\crash,protoLog使用)
  • Ubuntu 22.04.4 LTS + certbot 做自动续签SSL证书(2024-11-14亲测)
  • 自制C++游戏头文件:C++自己的游戏头文件!!!(后续会更新)
  • vulfocus apache-cve_2021_41773 漏洞复现
  • Hive中常出现的错误(不定时更新)
  • SpringBoot——国际化
  • 【MySQL系列】PolarDB入门使用
  • KubeVela核心控制器原理浅析
  • Introducing the Arm architecture
  • 黑马点评Redis笔记
  • java springboot测试类Transactional解决 测试过程中在数据库留下测试数据问题
  • ArgoCD基本组件
  • 基于Hadoop的区块链海量数据存储的设计与实现
  • 【开源】基于Vue和SpringBoot的食品生产管理系统
  • vr小鼠虚拟解剖实验教学平台减少了受感染风险
  • 【华为OD题库-038】支持优先级的对列-java
  • CountDownLatch和CyclicBarrier源码详解
  • 计算机毕业设计 基于SpringBoot的无人智慧超市管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解+答疑
  • android基于UDP实现聊天小功能
  • 计算机毕业设计|基于SpringBoot+MyBatis框架的仿天猫商城购物系统设计与实现
  • 第1章 爬虫基础
  • B树与B+树的对比
  • 树的序列化与反序列化