springboot3.x集成Elasticsearch8.5.3

1. 前言

项目基础为springboot3.0.2,目标是实现Elasticsearch的自定义高亮分页查询,网上提供的方法都是通过继承ElasticsearchRepository实现相关的查询,但是当我查询条件过多且复杂的时候方法命名会非常长,所以暂时弃用,投奔之前用过的spring-boot-starter-data-elasticsearch(主要使用的还是spring-data-elasticsearch5.0.1)。

由于spring-data-elasticsearch5.0.1版本中弃用了ElasticsearchRestTemplate类以及HighlightBuilder,高亮查询就变得异常麻烦。

2. 依赖与参数配置

2.1 pom.xml

xml 复制代码
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  <version>3.0.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser -->
<dependency>
  <groupId>org.apache.lucene</groupId>
  <artifactId>lucene-queryparser</artifactId>
  <version>8.11.2</version>
</dependency>

2.2 application.yml

yml 复制代码
spring:
  elasticsearch:
    uris: xxx
    username: xxxx
    password: xxxxx

3. 代码实现

java 复制代码
@Data
@Document(indexName = "user")
public class User {
    @Id
    private String id;
    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String name;
    @Field(type = FieldType.Date)
    private Date bir;
	@Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String content;
}
java 复制代码
@Service
@RequiredArgsConstructor
public class EsService {
    private final ElasticsearchTemplate restTemplate;

    /**
     * 初始化es序列
     */
    public boolean initIndex() {
        IndexOperations indexOperations = restTemplate.indexOps(User.class);
        if (!indexOperations.exists()) {
            indexOperations.create();
            Document mapping = indexOperations.createMapping();
            indexOperations.putMapping(mapping);
            return true;
        }
        return false;
    }

    /**
     * 初始化es数据
     *
     * @throws IOException
     */
    public void initEsData() {
        // 查询获取用户信息
        restTemplate.save(users);
    }


    /**
     * 分页查询数据
     *
     * @param keyword
     * @param pageNo
     * @param pageSize
     * @throws IOException
     */
    @Highlight(
            fields = {
                    @HighlightField(name = "field1"),
                    @.HighlightField(name = "field12"),
                    @HighlightField(name = "field13")
            },
            parameters = @HighlightParameters(
                    preTags = "<span style='color:#799ed9'>",
                    postTags = "</span>",
                    fragmentSize = 30,
                    numberOfFragments = 3,
                    requireFieldMatch = false
            )
    )// 高亮配置信息
    public PageInfo<User> searchEs(String keyword, Integer pageNo, Integer pageSize) {
        PageInfo<User> pageInfo = new PageInfo<>();
        if (pageNo <= 0) {
            pageNo = 1;
        }
        if (pageSize <= 0) {
            pageSize = 10;
        }
        pageInfo.setPageNo(pageNo);
        pageInfo.setPageSize(pageSize);
        // 分页数据
        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.Direction.DESC, "publishDate");

        // 条件查询
        SimpleQueryStringQuery queryBuilder = null;
        if (StringUtils.isNotBlank(keyword)) {
            keyword = QueryParser.escape(keyword);
            keyword = "\"" + keyword + "\"";
            queryBuilder = new SimpleQueryStringQuery.Builder().fields("field1", "field2")
                    .query(keyword).analyzer("ik_max_word").build(); // 查询条件
        }
        SimpleQueryStringQuery finalQueryBuilder = queryBuilder;
        NativeQueryBuilder builder = NativeQuery.builder();
        if (queryBuilder != null) {
            builder = builder.withQuery(q -> q.simpleQueryString(finalQueryBuilder));
        }
        // 创建一个HighlightQuery实例,指定要高亮的字段
        Method method = getMethod(EsService.class, "searchEs");
        if (method != null) {
            Highlight highlight = method.getAnnotation(Highlight.class);
            HighlightQuery highlightQuery = new HighlightQuery(
                    org.springframework.data.elasticsearch.core.query.highlight.Highlight.of(highlight),
                    User.class);
            builder = builder.withHighlightQuery(highlightQuery);
        }

        Query query = builder.withPageable(pageable).build();
        SearchHits<User> search = restTemplate.search(query, User.class);
        List<SearchHit<User>> searchHits = search.getSearchHits();

        long totalHits = search.getTotalHits();
        if (totalHits <= 0) {
            return pageInfo;
        }
        pageInfo.setCount(totalHits);
        List<User> list = new ArrayList<>();
        // 设置高亮数据
        for (SearchHit<User> hit : searchHits) {
            User content = hit.getContent();
            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(content));
            Map<String, List<String>> highlightFields = hit.getHighlightFields();
            if (highlightFields.isEmpty()) {
                list.add(content);
                continue;
            }
            for (Map.Entry<String, List<String>> entry : highlightFields.entrySet()) {
                StringBuffer stringBuffer = new StringBuffer();
                for (int i = 0; i < entry.getValue().size(); i++) {
                    if (i > 0) {
                        stringBuffer.append(",");
                    }
                    stringBuffer.append(entry.getValue().get(i));
                }
                jsonObject.put(entry.getKey(), stringBuffer.toString());
            }
            content = JSONObject.parseObject(jsonObject.toJSONString(), User.class);
            list.add(content);
        }
        pageInfo.setList(list);
        return pageInfo;
    }

    /**
     * 获取方法
     *
     * @param clz
     * @param methodName
     * @return
     */
    private Method getMethod(Class clz, String methodName) {
        Method[] methods = clz.getMethods();
        for (Method method : methods) {
            if (!method.getName().equals(methodName)) {
                continue;
            }
            return method;
        }
        return null;
    }
}

4. 结束语

本文通过一些非常规手段实现对应的高亮分页查询;仅供参考,如有更好的方式请留言指导,谢谢各位。

相关推荐
IT学长编程8 小时前
计算机毕业设计 教师科研信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·毕业设计·springboot·毕业论文·计算机毕业设计选题·计算机毕业设计开题报告·教师科研管理系统
Lill_bin9 小时前
深入理解ElasticSearch集群:架构、高可用性与数据一致性
大数据·分布式·elasticsearch·搜索引擎·zookeeper·架构·全文检索
RwTo11 小时前
Elasticsearch 聚合搜索
大数据·elasticsearch·搜索引擎·全文检索
求学小火龙12 小时前
ElasticSearch介绍+使用
java·大数据·elasticsearch
檀越剑指大厂12 小时前
【Elasticsearch系列六】系统命令API
大数据·elasticsearch·搜索引擎
孟诸13 小时前
计算机专业毕设-校园新闻网站
java·vue·毕业设计·springboot·课程设计
bug菌¹18 小时前
滚雪球学SpringCloud[5.1讲]: Spring Cloud Config详解
spring·elasticsearch·spring cloud
Li小李同学Li18 小时前
git学习【持续更新中。。。】
git·学习·elasticsearch
nangonghen19 小时前
通过logstash同步elasticsearch数据
大数据·elasticsearch
檀越剑指大厂20 小时前
【Elasticsearch系列四】ELK Stack
大数据·elk·elasticsearch