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日,希望你快乐

相关推荐
IT毕设梦工厂4 分钟前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
Ylucius38 分钟前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
凡人的AI工具箱1 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python
是店小二呀1 小时前
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
开发语言·c++·后端
七夜zippoe1 小时前
分布式系统实战经验
java·分布式
canonical_entropy1 小时前
金蝶云苍穹的Extension与Nop平台的Delta的区别
后端·低代码·架构
是梦终空1 小时前
JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·源代码·交通订票
落落落sss1 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
码爸1 小时前
flink doris批量sink
java·前端·flink
我叫啥都行2 小时前
计算机基础知识复习9.7
运维·服务器·网络·笔记·后端