SpringBoot中应该如何使用ElasticSearch呢
文章目录
目录
至于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日,希望你快乐