SpringBoot集成ElasticSearch

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

ES实战

效果

实现关键字搜索并高亮关键字

SpringBoot集成ElasticSearch,jenkins,运维

在线体验:http://www.sixkey-world.top文章来源地址https://www.toymoban.com/news/detail-840932.html

导入依赖

 <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
 </dependency>

配置文件

 spring:
   elasticsearch:
     uris: http://47.96.73.90:9200
     # 连接超时时间(默认1s)
     connection-timeout: 10s

ES客户端配置

 /**
  * ElasticSearch 客户端配置
  */
 @Configuration
 public class RestClientConfig extends AbstractElasticsearchConfiguration {
     @Bean
     @Override
     public RestHighLevelClient elasticsearchClient() {
         final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                 .connectedTo("host:9200")
                 .build();
         return RestClients.create(clientConfiguration).rest();
     }
 }

ES实体类

 /**
  * ES中的商品实体类
  * @author author
  * @since 2023-11-14
  */
 @Data
 @Document(indexName = "qs_goods")
 public class EsGoodsDto{
 ​
     @Id
     @Field(type = FieldType.Keyword)
     private Integer key;
 ​
     @Field(type = FieldType.Keyword)
     private Integer storeId;
 ​
     @Field(type = FieldType.Text,analyzer = "ik_max_word")
     private String store;
 ​
     @Field(index=false,type = FieldType.Keyword)
     private String storeImage;
 ​
     @Field(type = FieldType.Text,analyzer = "ik_max_word")
     private String name;
 ​
     @Field(type = FieldType.Double)
     private double price;
 ​
     @Field(index = false,type = FieldType.Integer)
     private Integer sale;
 ​
     @Field(index=false,type = FieldType.Keyword)
     private String image;
 }

ES Repository

 /**
  * 方便创建索引库,项目启动后自动创建实体类
  */
 @Repository
 public interface EsGoodsDtoRepository extends ElasticsearchRepository<EsGoodsDto,String> {
 }

ES常用方法

 /**
  * 封装ES的一些常用方法
  * @Author: @weixueshi
  * @Create: 2023/12/29 - 10:11
  * @Version: v1.0
  */
 @Service
 public class EsGoodsService {
 ​
     @Autowired
     private RestHighLevelClient client;
 ​
     /**
      * 批量导入商品数据
      * @param list
      */
     public void bulkSaveGoods(List<EsGoodsDto> list) throws IOException {
         BulkRequest bulkRequest = new BulkRequest();
         list.stream().forEach(goods -> {
             bulkRequest.add(new IndexRequest(EsConstant.INDEX_NAME_GOODS)
                     .id(goods.getKey().toString())
                     .source(JSON.toJSONString(goods),XContentType.JSON));
         });
         client.bulk(bulkRequest, RequestOptions.DEFAULT);
     }
 ​
     /**
      * 封装数据
      * @param response
      * @return
      */
     private List<EsGoodsDto> handlerResponse(SearchResponse response) {
         SearchHits searchHits = response.getHits();
         SearchHit[] hits = searchHits.getHits();
         List<EsGoodsDto> list = new ArrayList<EsGoodsDto>();
         for(SearchHit hit : hits){
             String json = hit.getSourceAsString();
             EsGoodsDto esGoodsDto = JSON.parseObject(json, EsGoodsDto.class);
             list.add(esGoodsDto);
         }
         return list;
     }
 ​
     /**
      * 返回搜索匹配到的商品id
      * @param param
      * @return
      * @throws IOException
      */
     public List<Integer> frontSearchList(String param,String selectMsg) throws IOException {
         SearchRequest request = new SearchRequest(EsConstant.INDEX_NAME_GOODS);
         if(StringUtils.isBlank(param)){
             return null;
         }else{
             if(EsConstant.GOODS_NAME.equalsIgnoreCase(selectMsg)){
                 //按商品名称搜索
                 request.source().query(QueryBuilders.multiMatchQuery(param,"name"));
                 SearchResponse response = client.search(request, RequestOptions.DEFAULT);
                 //处理返回数据
                 List<EsGoodsDto> list = handlerResponse(response);
                 List<Integer> goodsIds = list.stream().map(EsGoodsDto::getKey).collect(Collectors.toList());
                 return goodsIds;
             } else if (EsConstant.STORE_NAME.equalsIgnoreCase(selectMsg)) {
                 //按店铺名称搜索
                 request.source().query(QueryBuilders.multiMatchQuery(param,"store"));
                 SearchResponse response = client.search(request, RequestOptions.DEFAULT);
                 //处理返回数据
                 List<EsGoodsDto> list = handlerResponse(response);
                 List<Integer> storeIds = list.stream().map(EsGoodsDto::getStoreId).collect(Collectors.toList());
                 return storeIds;
             }
         }
         return null;
     }
 ​
     /**
      * 商品搜索
      * @param pageNo
      * @param pageSize
      * @param ids
      * @return
      */
     public Map<String, Object> searchGoodsFrontList(Integer pageNo, Integer pageSize, List<Integer> ids,String name) throws IOException {
         if(!CollectionUtils.isEmpty(ids)){
             SearchRequest request = new SearchRequest(EsConstant.INDEX_NAME_GOODS);
             //根据key查询
             request.source().query(QueryBuilders.termsQuery("key",ids));
             request.source().query(QueryBuilders.multiMatchQuery(name,"name"));
             //高亮查询完成
             request.source().highlighter(new HighlightBuilder()
                     .field("name")
                     .preTags("<font color='red'>")
                     .postTags("</font>")
                     .requireFieldMatch(false));
             request.source().from((pageNo - 1) * pageSize).size(pageSize);
             SearchResponse response = client.search(request, RequestOptions.DEFAULT);
             //高亮处理返回数据
             List<EsGoodsDto> list = handlerGoodsLightResponse(response);
             Map<String,Object> map = new HashMap<String,Object>();
             map.put("data",list);
             map.put("total",response.getHits().getTotalHits().value);
             return map;
         }
         return null;
     }
 ​
     private List<EsGoodsDto> handlerGoodsLightResponse(SearchResponse response) {
         SearchHits searchHits = response.getHits();
         SearchHit[] hits = searchHits.getHits();
         List<EsGoodsDto> list = new ArrayList<EsGoodsDto>();
         for(SearchHit hit : hits){
             String json = hit.getSourceAsString();
             EsGoodsDto esGoodsDto = JSON.parseObject(json, EsGoodsDto.class);
             Map<String, HighlightField> highlightFields = hit.getHighlightFields();
             if(!CollectionUtils.isEmpty(highlightFields)){
                 HighlightField highlightField = highlightFields.get("name");
                 if(highlightField != null){
                     String name = highlightField.getFragments()[0].string();
                     esGoodsDto.setName(name);
                 }
             }
             list.add(esGoodsDto);
         }
         return list;
     }
 ​
     /**
      * 新增商品文档
      * @param esGoodsDto
      * @throws IOException
      */
     public void addDocument(EsGoodsDto esGoodsDto) throws IOException {
         IndexRequest indexRequest = new IndexRequest(EsConstant.INDEX_NAME_GOODS).id(esGoodsDto.getKey().toString());
         indexRequest.source(JSON.toJSONString(esGoodsDto),XContentType.JSON);
         client.index(indexRequest,RequestOptions.DEFAULT);
     }
 ​
     /**
      * 删除文档
      * @param list
      * @throws IOException
      */
     public void deleteDocument(List<Integer> list,String indexName) throws IOException {
         BulkRequest bulkRequest = new BulkRequest();
         list.stream().forEach(id -> {
             bulkRequest.add(new DeleteRequest(indexName,id.toString()));
         });
         client.bulk(bulkRequest, RequestOptions.DEFAULT);
     }
 ​
     /**
      * 删除索引库
      * @throws IOException
      */
     public void deleteIndex(String indexName) throws IOException {
         DeleteIndexRequest deleteRequest = new DeleteIndexRequest(indexName);
         client.indices().delete(deleteRequest,RequestOptions.DEFAULT);
     }
 ​
     /**
      * 判断索引库是否存在
      * @return
      * @throws IOException
      */
     public boolean isExits(String indexName) throws IOException {
         GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);
         return client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
     }
 }

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

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

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

相关文章

  • 六、SpringBoot集成elasticsearch

    目录 官网API介绍 1、新建maven项目 2、检查elasticsearch依赖的版本 3、配置RestHighLevelClient对象 4、使用springboot-test测试API的使用 Java API Client https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/index.html Java REST Client(rest-high-level-client): https://www.elastic.co/guide/en/elasticsearc

    2024年02月09日
    浏览(66)
  • SpringBoot集成ElasticSearch

    实现搜索并高亮 在线体验:http://www.sixkey-world.top

    2024年03月17日
    浏览(44)
  • SpringBoot集成 ElasticSearch

    对于ElasticSearch比较陌生的小伙伴可以先看看ElasticSearch的概述ElasticSearch安装、启动、操作及概念简介 好的开始啦~ 1.1、导入依赖 新版本配置方式(推荐使用) 新的配置方式使用的是 High Level REST Client 的方式来替代之前的 Transport Client 方式,使用的是 HTTP 请求,和 Kibana 一样使

    2023年04月20日
    浏览(38)
  • SpringBoot3集成ElasticSearch

    目录 一、简介 二、环境搭建 1、下载安装包 2、服务启动 三、工程搭建 1、工程结构 2、依赖管理 3、配置文件 四、基础用法 1、实体类 2、初始化索引 3、仓储接口 4、查询语法 五、参考源码 标签:ElasticSearch8.Kibana8; Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎

    2024年02月12日
    浏览(40)
  • SpringBoot项目集成ElasticSearch服务

    本文已收录于专栏 《中间件合集》   Spring boot的版本是: 2.3.12   ElasticSearch的版本是:7.6.2   在我们的项目中经常会遇到对于字符串的一些操作,例如对于字符串的分词,通过一个词去查找对应的原文(全文搜索)。那可能有人就会问了,使用mysql的模糊查询也可以根据

    2024年02月12日
    浏览(42)
  • 【极光系列】springBoot集成elasticsearch

    直接下载解压可用 https://gitee.com/shawsongyue/aurora.git 模块:aurora_elasticsearch tips:注意es客户端版本要与java依赖版本一致,目前使用7.6.2版本 elasticsearch 7.6.2版本客户端下载: https://www.elastic.co/cn/downloads/elasticsearch 1.下载对应版本资源包 登录页面–》View path releases–》选择7.6.2版本

    2024年01月25日
    浏览(38)
  • 1.springboot 集成elasticsearch组件

    1.前置条件已经安装和搭建好了elasticsearch中间件 一:项目中引入elasticsearch相关依赖 我安装的elasticsearch版本是7.10.2 对应依赖的版本保持一致 此处省略springboot 搭建及必要的依赖项 二:项目配置文件里配置上elasticsearch相关的信息 application.yml 三:工程里编写elasticsearch相关的配

    2024年02月09日
    浏览(34)
  • springBoot 集成阿里云Elasticsearch

        原系统使用tcp方式接入ES,使用 ElasticsearchTemplate API方式交互ES。原springes的yml配置如下:         由于接入阿里云的ES,且加上了X-PACK验证模式,必须有用户名和密码。故拉取新的分支支持阿里云ES的配置。         由于A项目是SpringMvc方式的配置,下面讲一下遇到的问题

    2024年02月16日
    浏览(35)
  • springboot集成ElasticSearch版本号问题

    1.本地安装es版本 2.spring-boot-starter-parent 版本2.2.13对应自动集成的elasticsearch包版本是6.8.15 springboot和es版本对应关系查询地址  https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#repositories故springboot junit测试时查询报错    解决方案 1.将springboot包版本下降到2.1.3RELEASE就

    2024年02月11日
    浏览(38)
  • ElasticSearch完整入门及springboot集成

    Elaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是 通过

    2024年02月09日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包