SpringBoot中使用ElasticSearch

SpringBoot中应该如何使用ElasticSearch呢

文章目录

目录

文章目录

至于ElasticSearch安装包,链接获取

三个都需要下载

windows运行方法

IK分词器使用

1.导库

2.创建Es类

3.操作搜索类接口

4.添加

5.搜索实现

6.创建索引可以使用Kibnan来创建



至于ElasticSearch安装包,链接获取

【超级会员V6】通过百度网盘分享的文件:kibana-7.17.9.zip

链接:https://pan.baidu.com/s/1VQ2vJeHApupd4EMybRbTXw?pwd=sv5q

提取码:sv5q

【超级会员V6】通过百度网盘分享的文件:elasticsearch-analysis-ik-7.17.9.zip

链接:https://pan.baidu.com/s/1phSH4pXVIsund0zPzDu4QQ?pwd=sv5q

提取码:sv5q

【超级会员V6】通过百度网盘分享的文件:elasticsearch-7.17.9.zip

链接:https://pan.baidu.com/s/1iX8OPMdTXZ7XWqptPJJtZQ?pwd=sv5q

提取码:sv5q

三个都需要下载

windows运行方法

复制代码
ElasticSearch运行方法
//找到Elasticsearch文件夹,
打开文件夹找到bin文件夹,然后cmd,输入elasticsearch.bat就运行起来了
复制代码
//http://localhost:9200/

kibnan运行方法

复制代码
//找到kibana文件夹,
打开文件夹找到bin文件夹,然后cmd,输入kibana.bat就运行起来了
    //浏览器输入这个就运行成功了
    //http://localhost:5601

IK分词器使用

复制代码
在elasticsearch文件夹中找到plugins创建一个ik文件夹,然后把下载的最里面文件夹里面的内容保存到ik文件夹中,把这些文件放到请自行查看你自己的文件夹系统

这里我的ElasticSearch文件中已经有IK分词器了,如果没有上面下载,自己替换就可以

1.导库

XML 复制代码
        <!--elasticsearch-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

2.创建Es类

java 复制代码
package com.xinggui.domain.esDto;


import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.util.Date;

//这里的Document注解的意思是你要操作哪一个索引库,对比mysql就是你要操作哪一个类型的表格
@Document(indexName = "search_es_index")
@Data
public class SearchEsDto {

    //格式化时间
    private static final String DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

    @Id
    private Long id;

    /**
     * 0:PSD 1:AI 2:CDR 3:3D
     */
    private Integer type;

    /**
     * 图片大小
     */
    private Long size;

    /**
     * 用户id
     */
    private Long userId;

    /**
     * 图片水印路径
     */
    private String imageWatherPath;

    /**
     * 文件名字
     */
    private String fileName;

    /**
     * 设置分类id
     */
    private Integer classificationId;


    /**
     * 分类id
     */
    private Integer categoryId;

    /**
     *
     */
    @Field(index = false, store = true, type = FieldType.Date, format = {}, pattern = DATE_TIME_PATTERN)
    private Date createtime;

    /**
     *
     */
    @Field(index = false, store = true, type = FieldType.Date, format = {}, pattern = DATE_TIME_PATTERN)
    private Date updatetime;
}

3.操作搜索类接口

java 复制代码
package com.xinggui.esdao;

import com.xinggui.domain.esDto.SearchEsDto;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

//这里的第一个SearchEsDto替换为自己要操作的ES定义的类
public interface PostEsDao extends ElasticsearchRepository<SearchEsDto, Long> {

}

4.添加

java 复制代码
    @Test
    void contextLoads() throws ParseException {
        SearchEsDto searchEsDto = new SearchEsDto();
        searchEsDto.setId(1832693063378546690L);
        searchEsDto.setType(0);
        searchEsDto.setSize(41917441L);
        searchEsDto.setUserId(1187086337L);
        searchEsDto.setImageWatherPath("/avatar/output/output_1725783050205.png");
        searchEsDto.setFileName("蜘蛛侠海报");
        searchEsDto.setCategoryId(23);
        searchEsDto.setClassificationId(1);
        // 定义日期时间格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        searchEsDto.setCreatetime(sdf.parse("2024-09-09 07:45:33"));
        searchEsDto.setUpdatetime(sdf.parse("2024-09-09 07:45:33"));
        postEsDao.save(searchEsDto);
        System.out.println(searchEsDto.getId());
    }

5.搜索实现

java 复制代码
@Resource
    private ElasticsearchRestTemplate elasticsearchTemplate;


    /**
     * 搜索功能的实现
     * 
     * @param searchName 搜索名称,用于匹配文件名
     * @param classificationId 分类ID,默认为1,用于过滤结果
     * @param categoryId 类别ID,用于进一步过滤结果
     * @param formatsId 格式ID,用于过滤结果
     * @param page 页码,默认为1,表示搜索结果的页码
     * @param size 页大小,默认为30,表示每页搜索结果的数量
     * @return 返回一个包含搜索结果的响应对象
     */
    @GetMapping
    public ResponseVO<List<SearchEsDto>> search(
            String searchName,
            @RequestParam(defaultValue = "1") Integer classificationId,
            Integer categoryId,
            Integer formatsId,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "30") Integer size
    ){
    
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        // 构建查询条件
        if(classificationId != null && (classificationId > 0 && classificationId < 5)){
            boolQueryBuilder.must(QueryBuilders.termQuery("classificationId", classificationId));
        }
        if(categoryId != null && (categoryId > 10 && categoryId < 58)){
            boolQueryBuilder.must(QueryBuilders.termQuery("categoryId", categoryId));
        }
        if(formatsId != null && (formatsId > 0 && formatsId < 6)){
            boolQueryBuilder.must(QueryBuilders.termQuery("formatsId", formatsId));
        }
        if(StrUtil.isNotBlank(searchName)){
            boolQueryBuilder.must(QueryBuilders.matchQuery("fileName", searchName));
        }
        // 设置分页信息
        PageRequest pageRequest = PageRequest.of(page - 1, size);
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withPageable(pageRequest).build();
        // 执行搜索
        SearchHits<SearchEsDto> searchHits = elasticsearchTemplate.search(searchQuery, SearchEsDto.class);
        List<SearchEsDto> contentList = searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
        // 返回搜索结果
        return getSuccessResponseVO(contentList);
    }

6.创建索引可以使用Kibnan来创建

java 复制代码
PUT /search_es_index
{
  "mappings": {
    "properties": {
      "id": {
        "type": "long"
      },
      "type": {
        "type": "integer"
      },
      "size": {
        "type": "long"
      },
      "userId": {
        "type": "long"
      },
      "filePath": {
        "type": "keyword"
      },
      "imagePath": {
        "type": "keyword"
      },
      "imageWatherPath": {
        "type": "keyword"
      },
      "fileName": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "categoryId": {
        "type": "integer"
      },
      "createtime": {
        "type": "date",
      },
      "updatetime": {
        "type": "date",
      }
    }
  }
}

今日2024年09.19日,希望你快乐

相关推荐
许彰午4 分钟前
52-useWebSocket自动重连
java·低代码·架构
青山木6 分钟前
RocketMQ 入门到原理(一):整体架构与消息的生命周期
java·分布式·后端·中间件·架构·rocketmq
黑马程序员毕设12 分钟前
基于微信小程序的二手交易平台设计与实现报告
前端·人工智能·spring boot·后端·考研
xcl092513 分钟前
上海24小时自助健身房系统软件开发实战与架构解析
java·spring boot
苏渡苇16 分钟前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring·spring cloud·系统监控·apm
张宜强30 分钟前
023 SpringBoot实现萌宠集市
java·课程设计
花哥码天下32 分钟前
docker流水线
java
十二同学啊1 小时前
Drools规则引擎:让复杂业务规则从代码中解耦
java·后端·开源
熊猫猫猫猫猫猫1 小时前
Lambda Fusion:面向企业级应用与 AI 智能体开发的开源微服务框架
spring boot
周先生FullStack1 小时前
Mac + 容器本地 MySQL/Redis 环境搭建与网络原理实战
java·spring boot·微服务·容器·架构·个人开发