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

这篇具有很好参考价值的文章主要介绍了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的全文分页检索、不分页检索文章来源地址https://www.toymoban.com/news/detail-756950.html

到了这里,关于SpringBoot封装Elasticsearch搜索引擎实现全文检索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Lucene轻量级搜索引擎,Solr 和 ElasticSearch 都是基于 Lucene 的封装

    Lucene轻量级搜索引擎,Solr 和 ElasticSearch 都是基于 Lucene 的封装

    1、Lucene 是什么 Lucene 是一个本地全文搜索引擎,Solr 和 ElasticSearch 都是基于 Lucene 的封装 Lucene 适合那种轻量级的全文搜索,我就是服务器资源不够,如果上 ES 的话会很占用服务器资源,所有就选择了 Lucene 搜索引擎 2、倒排索引原理 全文搜索的原理是使用了倒排索引,那么什么是倒

    2024年03月15日
    浏览(12)
  • 搜索引擎ElasticSearch分布式搜索和分析引擎学习,SpringBoot整合ES个人心得

    搜索引擎ElasticSearch分布式搜索和分析引擎学习,SpringBoot整合ES个人心得

    Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,

    2024年02月04日
    浏览(17)
  • 【搜索引擎2】实现API方式调用ElasticSearch8接口

    【搜索引擎2】实现API方式调用ElasticSearch8接口

    1、理解ElasticSearch各名词含义 ElasticSearch对比Mysql Mysql数据库 Elastic Search Database 7.X版本前有Type,对比数据库中的表,新版取消了 Table Index Row Document Column mapping Elasticsearch是使用Java开发的,8.1版本的ES需要JDK17及以上版本;es默认带有JDK,如果安装es环境为java8,则会默认使用自带

    2024年04月17日
    浏览(15)
  • elasticsearch[五]:深入探索ES搜索引擎的自动补全与拼写纠错:如何实现高效智能的搜索体验

    elasticsearch[五]:深入探索ES搜索引擎的自动补全与拼写纠错:如何实现高效智能的搜索体验

    前一章讲了搜索中的拼写纠错功能,里面一个很重要的概念就是莱文斯坦距离。这章会讲解搜索中提升用户体验的另一项功能 - [自动补全]。本章直接介绍 ES 中的实现方式以及真正的搜索引擎对自动补全功能的优化。 大家对上面的这个应该都不陌生,搜索引擎会根据你输入的

    2024年01月24日
    浏览(19)
  • 如何使用内网穿透工具实现Java远程连接本地Elasticsearch搜索分析引擎

    如何使用内网穿透工具实现Java远程连接本地Elasticsearch搜索分析引擎

    简单几步,结合Cpolar 内网穿透工具实现Java 远程连接操作本地分布式搜索和数据分析引擎Elasticsearch。 Cpolar内网穿透提供了更高的安全性和隐私保护,通过使用加密通信通道,Cpolar技术可以确保数据传输的安全性,这为用户和团队提供了更可靠的保护,使他们能够放心地处理和

    2024年02月04日
    浏览(13)
  • 分布式搜索和分析引擎Elasticsearch本地部署结合内网穿透实现远程访问

    分布式搜索和分析引擎Elasticsearch本地部署结合内网穿透实现远程访问

    本文主要介绍如何在Windows系统部署分布式搜索和分析引擎Elasticsearch,并结合Cpolar内网穿透工具实现公网远程连接和访问本地服务。 Elasticsearch是一个基于Lucene库的分布式搜索和分析引擎,它提供了一个分布式、多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档,同时也

    2024年01月21日
    浏览(15)
  • 《Spring Boot 实战派》--13.集成NoSQL数据库,实现Elasticsearch和Solr搜索引擎

    《Spring Boot 实战派》--13.集成NoSQL数据库,实现Elasticsearch和Solr搜索引擎

             关于搜索引擎 我们很难实现 Elasticseach 和 Solr两大搜索框架的效果;所以本章针对两大搜索框架,非常详细地讲解 它们的原理和具体使用方法, 首先 介绍什么是搜索引擎 、如何用 MySQL实现简单的搜索引擎,以及Elasticseach 的 概念和接口类; 然后介绍Elasticseach

    2023年04月09日
    浏览(11)
  • 如何通过内网穿透实现Java远程连接操作本地Elasticsearch开源搜索和分析引擎

    如何通过内网穿透实现Java远程连接操作本地Elasticsearch开源搜索和分析引擎

    本文主要介绍在无公网ip环境,如何使用cpolar内网穿透工具实现Java远程连接操作本地Elasticsearch开源搜索和分析引擎。 Cpolar内网穿透提供了更高的安全性和隐私保护,通过使用加密通信通道,Cpolar技术可以确保数据传输的安全性,这为用户和团队提供了更可靠的保护,使他们

    2024年01月23日
    浏览(14)
  • 分布式搜索引擎ElasticSearch——搜索功能

    分布式搜索引擎ElasticSearch——搜索功能

    DSL查询分类 DSL官方文档 全文检索查询 精确查询 地理查询 复合查询 Function Score Query function score query Boolean Query 排序 分页 官方文档 高亮 快速入门 match,term,range,bool查询 排序和分页 高亮显示 就是在前面抽取的解析代码中进一步添加关于高亮的解析部分,因为highlight和so

    2024年02月01日
    浏览(18)
  • 分布式搜索引擎——elasticsearch搜索功能

    分布式搜索引擎——elasticsearch搜索功能

    Elasticsearch提供了基于JSON的DSL (Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: match_query multi_match_query 精确查询:根据精确词条

    2024年02月05日
    浏览(17)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包