Compare commits

..

1 Commits

Author SHA1 Message Date
mf-xuao 78b6de7c23 first commit jdk 17版本 4 weeks ago

@ -130,9 +130,21 @@
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
</dependency> </dependency>
<!-- es--> <!-- es-->
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.elasticsearch.client</groupId> <groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId> <artifactId>elasticsearch-rest-client</artifactId>
</dependency>
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.parsson</groupId>
<artifactId>parsson</artifactId>
</dependency> </dependency>
<!-- gson--> <!-- gson-->
<dependency> <dependency>

@ -1,5 +1,9 @@
package com.hongshu.common.config.es; package com.hongshu.common.config.es;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost; import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope; import org.apache.http.auth.AuthScope;
@ -7,8 +11,6 @@ import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider; import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -34,29 +36,42 @@ public class ESConfig {
@Value("${es.password}") @Value("${es.password}")
String password; String password;
private RestHighLevelClient client; private RestClient restClient;
private ElasticsearchClient client;
private ElasticsearchTransport transport;
@Bean(name = "elasticsearchClient") @Bean(name = "elasticsearchClient")
public RestHighLevelClient getElasticsearchClient() { public ElasticsearchClient getElasticsearchClient() {
// 设置用户名和密码 // 设置用户名和密码
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
// 创建带有基本身份验证的 RestClient // 创建带有基本身份验证的 RestClient
RestClientBuilder builder = RestClient.builder(new HttpHost(esUrl, esPort)) restClient = RestClient.builder(
new HttpHost(esUrl, esPort)
)
.setHttpClientConfigCallback(httpClientBuilder -> .setHttpClientConfigCallback(httpClientBuilder ->
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider) httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
); )
.build();
// 使用 Jackson 映射器创建传输层
transport = new RestClientTransport(
restClient, new JacksonJsonpMapper()
);
// 创建 API 客户端 // 创建 API 客户端
client = new RestHighLevelClient(builder); client = new ElasticsearchClient(transport);
return client; return client;
} }
public void close() { public void close() {
if (client != null) { if (client != null) {
try { try {
client.close(); transport.close();
restClient.close();
} catch (IOException e) { } catch (IOException e) {
log.error("关闭es连接异常"); log.error("关闭es连接异常");
} }

@ -59,3 +59,35 @@ spring:
wall: wall:
config: config:
multi-statement-allow: true multi-statement-allow: true
# redis 配置
redis:
# 地址
host: localhost
# 端口默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# ElasticSearch配置
es:
url: 192.168.3.90
port: 9200
username:
password:

@ -0,0 +1,94 @@
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://192.168.3.90:3306/ipdz_ddns?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
username: xuao
password: xuao@dev123!
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置连接超时时间
connectTimeout: 30000
# 配置网络超时时间
socketTimeout: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: admin
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
# redis 配置
redis:
# 地址
host: redis.rpk.ipdz.me
# 端口默认为6379
port: 19379
# 数据库索引
database: 0
# 密码
password: guoguo
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# ElasticSearch配置
es:
url: 192.168.3.90
port: 9200
username: elastic
password: 8QJJIlWkxRe7Nn-Foj03

@ -52,7 +52,7 @@ spring:
# 国际化资源文件路径 # 国际化资源文件路径
basename: i18n/messages basename: i18n/messages
profiles: profiles:
active: druid active: test
# 文件上传 # 文件上传
servlet: servlet:
multipart: multipart:
@ -66,28 +66,6 @@ spring:
# 热部署开关 # 热部署开关
enabled: true enabled: true
# redis 配置
redis:
# 地址
host: localhost
# 端口默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# token配置 # token配置
token: token:
@ -140,12 +118,6 @@ xss:
# 匹配链接 # 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/* urlPatterns: /system/*,/monitor/*,/tool/*
# ElasticSearch配置
es:
url: localhost
port: 9200
username:
password:
# Oss配置 # Oss配置
oss: oss:

@ -1,7 +1,9 @@
package com.hongshu.web.service.impl; package com.hongshu.web.service.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson2.JSON; import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.GetResponse;
import co.elastic.clients.elasticsearch.core.UpdateResponse;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hongshu.common.constant.NoteConstant; import com.hongshu.common.constant.NoteConstant;
@ -18,12 +20,6 @@ import com.hongshu.web.mapper.WebUserMapper;
import com.hongshu.web.mapper.WebUserNoteRelationMapper; import com.hongshu.web.mapper.WebUserNoteRelationMapper;
import com.hongshu.web.service.IWebBrowseRecordService; import com.hongshu.web.service.IWebBrowseRecordService;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -48,7 +44,7 @@ public class WebBrowseRecordServiceImpl extends ServiceImpl<WebNoteMapper, WebNo
@Autowired @Autowired
private WebLikeOrCollectMapper likeOrCollectionMapper; private WebLikeOrCollectMapper likeOrCollectionMapper;
@Autowired @Autowired
private RestHighLevelClient restHighLevelClient; private ElasticsearchClient elasticsearchClient;
/** /**
@ -122,18 +118,21 @@ public class WebBrowseRecordServiceImpl extends ServiceImpl<WebNoteMapper, WebNo
private void updateEsNote(BrowseRecordDTO browseRecordDTO) { private void updateEsNote(BrowseRecordDTO browseRecordDTO) {
try { try {
// Step 1: 获取现有的数据 // Step 1: 获取现有的数据
GetRequest getRequest = new GetRequest(NoteConstant.NOTE_INDEX, browseRecordDTO.getNid()); GetResponse<NoteSearchVO> getResponse = elasticsearchClient.get(g ->
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT); g.index(NoteConstant.NOTE_INDEX)
.id(browseRecordDTO.getNid()),
NoteSearchVO.class);
// 检查是否获取到了数据 // 检查是否获取到了数据
if (getResponse.isExists()) { if (getResponse.found()) {
NoteSearchVO noteSearchVo = JSON.parseObject(getResponse.getSourceAsString(), NoteSearchVO.class); NoteSearchVO noteSearchVo = getResponse.source();
// Step 2: 更新 viewCount 字段 // Step 2: 更新 viewCount 字段
noteSearchVo.setViewCount(noteSearchVo.getViewCount() + 1); noteSearchVo.setViewCount(noteSearchVo.getViewCount() + 1);
// Step 3: 将更新后的数据保存回 Elasticsearch // Step 3: 将更新后的数据保存回 Elasticsearch
UpdateRequest updateRequest = new UpdateRequest(NoteConstant.NOTE_INDEX, browseRecordDTO.getNid()) UpdateResponse<NoteSearchVO> updateResponse = elasticsearchClient.update(u ->
.doc(JSON.toJSONString(noteSearchVo), XContentType.JSON); u.index(NoteConstant.NOTE_INDEX)
restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT); .id(browseRecordDTO.getNid())
.doc(noteSearchVo),
NoteSearchVO.class);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();

@ -1,7 +1,14 @@
package com.hongshu.web.service.impl; package com.hongshu.web.service.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson2.JSON; import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.bulk.BulkOperation;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.elasticsearch.core.search.TotalHits;
import co.elastic.clients.elasticsearch.indices.CreateIndexRequest;
import co.elastic.clients.elasticsearch.indices.DeleteIndexRequest;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -25,26 +32,6 @@ import com.hongshu.web.service.IWebEsNoteService;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -67,7 +54,7 @@ public class WebEsNoteServiceImpl extends ServiceImpl<WebNoteMapper, WebNote> im
@Autowired @Autowired
private WebNoteMapper noteMapper; private WebNoteMapper noteMapper;
@Autowired @Autowired
private RestHighLevelClient restHighLevelClient; private ElasticsearchClient elasticsearchClient;
@Autowired @Autowired
private WebLikeOrCollectMapper likeOrCollectionMapper; private WebLikeOrCollectMapper likeOrCollectionMapper;
@ -84,48 +71,40 @@ public class WebEsNoteServiceImpl extends ServiceImpl<WebNoteMapper, WebNote> im
Page<NoteSearchVO> page = new Page<>(); Page<NoteSearchVO> page = new Page<>();
List<NoteSearchVO> noteSearchVOList = new ArrayList<>(); List<NoteSearchVO> noteSearchVOList = new ArrayList<>();
try { try {
SearchRequest searchRequest = new SearchRequest(NoteConstant.NOTE_INDEX); SearchRequest.Builder builder = new SearchRequest.Builder().index(NoteConstant.NOTE_INDEX);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder mainQuery = QueryBuilders.boolQuery();
if (StringUtils.isNotBlank(esNoteDTO.getKeyword())) { if (StringUtils.isNotBlank(esNoteDTO.getKeyword())) {
BoolQueryBuilder keywordQuery = QueryBuilders.boolQuery() builder.query(q -> q.bool(b -> b
.should(QueryBuilders.matchQuery("title", esNoteDTO.getKeyword()).boost(1f)) .should(h -> h.match(f -> f.field("title").boost(1f).query(esNoteDTO.getKeyword())))
.should(QueryBuilders.matchQuery("username", esNoteDTO.getKeyword()).boost(0.5f)) .should(h -> h.match(f -> f.field("username").boost(0.5f).query(esNoteDTO.getKeyword())))
.should(QueryBuilders.matchQuery("content", esNoteDTO.getKeyword()).boost(1f)) .should(h -> h.match(f -> f.field("content").boost(1f).query(esNoteDTO.getKeyword())))
.should(QueryBuilders.matchQuery("tags", esNoteDTO.getKeyword()).boost(4f)) .should(h -> h.match(f -> f.field("tags").boost(4f).query(esNoteDTO.getKeyword())))
.should(QueryBuilders.matchQuery("categoryName", esNoteDTO.getKeyword()).boost(2f)) .should(h -> h.match(f -> f.field("categoryName").boost(2f).query(esNoteDTO.getKeyword())))
.should(QueryBuilders.matchQuery("categoryParentName", esNoteDTO.getKeyword()).boost(1.5f)); .should(h -> h.match(f -> f.field("categoryParentName").boost(1.5f).query(esNoteDTO.getKeyword())))
mainQuery.must(keywordQuery); ));
} }
if (StringUtils.isNotBlank(esNoteDTO.getCpid()) && StringUtils.isNotBlank(esNoteDTO.getCid())) { if (StringUtils.isNotBlank(esNoteDTO.getCpid()) && StringUtils.isNotBlank(esNoteDTO.getCid())) {
mainQuery.must(QueryBuilders.matchQuery("cid", esNoteDTO.getCid())) builder.query(q -> q.bool(b -> b
.must(QueryBuilders.matchQuery("cpid", esNoteDTO.getCpid())); .must(h -> h.match(m -> m.field("cid").query(esNoteDTO.getCid())))
.must(h -> h.match(m -> m.field("cpid").query(esNoteDTO.getCpid())))
));
} else if (StringUtils.isNotBlank(esNoteDTO.getCpid())) { } else if (StringUtils.isNotBlank(esNoteDTO.getCpid())) {
mainQuery.must(QueryBuilders.matchQuery("cpid", esNoteDTO.getCpid())); builder.query(h -> h.match(m -> m.field("cpid").query(esNoteDTO.getCpid())));
}
if (mainQuery.hasClauses()) {
sourceBuilder.query(mainQuery);
} }
if (esNoteDTO.getType() == 1) { if (esNoteDTO.getType() == 1) {
sourceBuilder.sort("likeCount", SortOrder.DESC); builder.sort(o -> o.field(f -> f.field("likeCount").order(SortOrder.Desc)));
} else if (esNoteDTO.getType() == 2) { } else if (esNoteDTO.getType() == 2) {
sourceBuilder.sort("time", SortOrder.DESC); builder.sort(o -> o.field(f -> f.field("time").order(SortOrder.Desc)));
} }
builder.from((int) (currentPage - 1) * (int) pageSize);
sourceBuilder.from((int) (currentPage - 1) * (int) pageSize); builder.size((int) pageSize);
sourceBuilder.size((int) pageSize); SearchRequest searchRequest = builder.build();
searchRequest.source(sourceBuilder); SearchResponse<NoteSearchVO> searchResponse = elasticsearchClient.search(searchRequest, NoteSearchVO.class);
TotalHits totalHits = searchResponse.hits().total();
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); page.setTotal(Objects.requireNonNull(totalHits).value());
long totalHits = searchResponse.getHits().getTotalHits().value; List<Hit<NoteSearchVO>> hits = searchResponse.hits().hits();
page.setTotal(totalHits); for (Hit<NoteSearchVO> hit : hits) {
NoteSearchVO noteSearchVo = hit.source();
for (SearchHit hit : searchResponse.getHits().getHits()) {
NoteSearchVO noteSearchVo = JSON.parseObject(hit.getSourceAsString(), NoteSearchVO.class);
noteSearchVOList.add(noteSearchVo); noteSearchVOList.add(noteSearchVo);
} }
} catch (Exception e) { } catch (Exception e) {
@ -160,25 +139,23 @@ public class WebEsNoteServiceImpl extends ServiceImpl<WebNoteMapper, WebNote> im
List<NoteSearchVO> noteSearchVOList = new ArrayList<>(); List<NoteSearchVO> noteSearchVOList = new ArrayList<>();
//得到当前用户的浏览记录 //得到当前用户的浏览记录
try { try {
SearchRequest searchRequest = new SearchRequest(NoteConstant.NOTE_INDEX); SearchRequest.Builder builder = new SearchRequest.Builder().index(NoteConstant.NOTE_INDEX);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); builder.size(1000);
sourceBuilder.size(1000); SearchRequest searchRequest = builder.build();
searchRequest.source(sourceBuilder); SearchResponse<NoteSearchVO> searchResponse = elasticsearchClient.search(searchRequest, NoteSearchVO.class);
TotalHits totalHits = searchResponse.hits().total();
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); //得到所有的数据
long totalHits = searchResponse.getHits().getTotalHits().value; List<Hit<NoteSearchVO>> hits = searchResponse.hits().hits();
if (CollectionUtil.isNotEmpty(hits)) {
SearchHit[] hits = searchResponse.getHits().getHits(); for (Hit<NoteSearchVO> hit : hits) {
if (hits.length > 0) { NoteSearchVO noteSearchVo = hit.source();
for (SearchHit hit : hits) {
NoteSearchVO noteSearchVo = JSON.parseObject(hit.getSourceAsString(), NoteSearchVO.class);
noteSearchVOList.add(noteSearchVo); noteSearchVOList.add(noteSearchVo);
} }
Collections.shuffle(noteSearchVOList); Collections.shuffle(noteSearchVOList);
List<List<NoteSearchVO>> partition = Lists.partition(noteSearchVOList, (int) pageSize); List<List<NoteSearchVO>> partition = Lists.partition(noteSearchVOList, (int) pageSize);
List<NoteSearchVO> noteSearchVOS = partition.get((int) currentPage - 1); List<NoteSearchVO> noteSearchVOS = partition.get((int) currentPage - 1);
page.setTotal(totalHits); page.setTotal(totalHits != null ? totalHits.value() : 0);
page.setRecords(noteSearchVOS); page.setRecords(noteSearchVOS);
} }
} catch (Exception e) { } catch (Exception e) {
@ -199,19 +176,15 @@ public class WebEsNoteServiceImpl extends ServiceImpl<WebNoteMapper, WebNote> im
Page<WebUser> page = new Page<>(); Page<WebUser> page = new Page<>();
String userId = WebUtils.getRequestHeader(UserConstant.USER_ID); String userId = WebUtils.getRequestHeader(UserConstant.USER_ID);
// 用户ID为空 默认随机加载100条数据 // 用户ID为空 默认随机加载100条数据
List<WebUser> recommendList = new ArrayList<>(); List<WebUser> recommendList = null;
if (StringUtils.isBlank(userId)) { if (StringUtils.isBlank(userId)) {
SearchRequest searchRequest = new SearchRequest(NoteConstant.NOTE_INDEX); SearchRequest searchRequest = SearchRequest.of(s -> s
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); .index(NoteConstant.NOTE_INDEX)
sourceBuilder.size(100); .size(100));
searchRequest.source(sourceBuilder); SearchResponse<WebUser> searchResponse = elasticsearchClient.search(searchRequest, WebUser.class);
recommendList = searchResponse.hits().hits().stream()
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); .map(Hit::source)
.collect(Collectors.toList());
for (SearchHit hit : searchResponse.getHits().getHits()) {
WebUser user = JSON.parseObject(hit.getSourceAsString(), WebUser.class);
recommendList.add(user);
}
// 随机排序 // 随机排序
Collections.shuffle(recommendList, new Random()); Collections.shuffle(recommendList, new Random());
} else { } else {
@ -225,7 +198,6 @@ public class WebEsNoteServiceImpl extends ServiceImpl<WebNoteMapper, WebNote> im
page.setRecords(Collections.emptyList()); page.setRecords(Collections.emptyList());
return page; return page;
} }
List<WebUser> userList = partition.get((int) currentPage - 1); List<WebUser> userList = partition.get((int) currentPage - 1);
page.setTotal(recommendList.size()); page.setTotal(recommendList.size());
page.setRecords(userList); page.setRecords(userList);
@ -244,29 +216,35 @@ public class WebEsNoteServiceImpl extends ServiceImpl<WebNoteMapper, WebNote> im
List<NoteSearchVO> noteSearchVOList = new ArrayList<>(); List<NoteSearchVO> noteSearchVOList = new ArrayList<>();
try { try {
SearchRequest searchRequest = new SearchRequest(NoteConstant.NOTE_INDEX); // 构建搜索请求
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); SearchRequest.Builder builder = new SearchRequest.Builder()
sourceBuilder.from(Math.toIntExact((currentPage - 1) * pageSize)); .index(NoteConstant.NOTE_INDEX)
sourceBuilder.size(Math.toIntExact(pageSize)); .from(Math.toIntExact((currentPage - 1) * pageSize)) // 设置分页起始点
sourceBuilder.sort("likeCount", SortOrder.DESC); .size(Math.toIntExact(pageSize)) // 设置分页大小
searchRequest.source(sourceBuilder); .sort(s -> s.field(f -> f.field("likeCount").order(SortOrder.Desc))); // 按 likeCount 降序排序
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); SearchRequest searchRequest = builder.build();
long totalHits = searchResponse.getHits().getTotalHits().value;
// 执行搜索请求
SearchHit[] hits = searchResponse.getHits().getHits(); SearchResponse<NoteSearchVO> searchResponse = elasticsearchClient.search(searchRequest, NoteSearchVO.class);
if (hits.length > 0) { TotalHits totalHits = searchResponse.hits().total();
for (SearchHit hit : hits) {
NoteSearchVO noteSearchVo = JSON.parseObject(hit.getSourceAsString(), NoteSearchVO.class); // 获取搜索结果
List<Hit<NoteSearchVO>> hits = searchResponse.hits().hits();
if (CollectionUtil.isNotEmpty(hits)) {
for (Hit<NoteSearchVO> hit : hits) {
NoteSearchVO noteSearchVo = hit.source();
noteSearchVOList.add(noteSearchVo); noteSearchVOList.add(noteSearchVo);
} }
} }
page.setTotal(totalHits); // 设置分页结果
page.setTotal(totalHits != null ? totalHits.value() : 0);
page.setRecords(noteSearchVOList); page.setRecords(noteSearchVOList);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
// 这里可以进一步处理异常,比如记录日志或者抛出自定义异常
} }
return page; return page;
} }
@ -279,11 +257,8 @@ public class WebEsNoteServiceImpl extends ServiceImpl<WebNoteMapper, WebNote> im
@Override @Override
public void addNote(NoteSearchVO noteSearchVo) { public void addNote(NoteSearchVO noteSearchVo) {
try { try {
IndexRequest indexRequest = new IndexRequest(NoteConstant.NOTE_INDEX) CreateResponse createResponse = elasticsearchClient.create(e -> e.index(NoteConstant.NOTE_INDEX).id(noteSearchVo.getId()).document(noteSearchVo));
.id(noteSearchVo.getId()) log.info("createResponse.result{}", createResponse.result());
.source(JSON.toJSONString(noteSearchVo), XContentType.JSON);
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
log.info("indexResponse.result{}", indexResponse.getResult());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -297,10 +272,8 @@ public class WebEsNoteServiceImpl extends ServiceImpl<WebNoteMapper, WebNote> im
@Override @Override
public void updateNote(NoteSearchVO noteSearchVo) { public void updateNote(NoteSearchVO noteSearchVo) {
try { try {
UpdateRequest updateRequest = new UpdateRequest(NoteConstant.NOTE_INDEX, noteSearchVo.getId()) UpdateResponse<NoteSearchVO> updateResponse = elasticsearchClient.update(e -> e.index(NoteConstant.NOTE_INDEX).id(noteSearchVo.getId()).doc(noteSearchVo), NoteSearchVO.class);
.doc(JSON.toJSONString(noteSearchVo), XContentType.JSON); log.info("updateResponse.result() = " + updateResponse.result());
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
log.info("updateResponse.result() = " + updateResponse.getResult());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -314,9 +287,8 @@ public class WebEsNoteServiceImpl extends ServiceImpl<WebNoteMapper, WebNote> im
@Override @Override
public void deleteNote(String noteId) { public void deleteNote(String noteId) {
try { try {
DeleteRequest deleteRequest = new DeleteRequest(NoteConstant.NOTE_INDEX, String.valueOf(noteId)); DeleteResponse deleteResponse = elasticsearchClient.delete(e -> e.index(NoteConstant.NOTE_INDEX).id(String.valueOf(noteId)));
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT); log.info("deleteResponse.result() ={} ", deleteResponse.result());
log.info("deleteResponse.result() ={} ", deleteResponse.getResult());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -344,15 +316,13 @@ public class WebEsNoteServiceImpl extends ServiceImpl<WebNoteMapper, WebNote> im
noteSearchVo.setIsLike(likeOrCollectionIds.contains(noteSearchVo.getId())); noteSearchVo.setIsLike(likeOrCollectionIds.contains(noteSearchVo.getId()));
} }
try { try {
BulkRequest bulkRequest = new BulkRequest(); List<BulkOperation> result = new ArrayList<>();
for (NoteSearchVO noteSearchVo : noteSearchVOList) { for (NoteSearchVO noteSearchVo : noteSearchVOList) {
IndexRequest indexRequest = new IndexRequest(NoteConstant.NOTE_INDEX) result.add(new BulkOperation.Builder().create(
.id(noteSearchVo.getId()) d -> d.document(noteSearchVo).id(noteSearchVo.getId()).index(NoteConstant.NOTE_INDEX)).build());
.source(JSON.toJSONString(noteSearchVo), XContentType.JSON);
bulkRequest.add(indexRequest);
} }
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT); BulkResponse bulkResponse = elasticsearchClient.bulk(e -> e.index(NoteConstant.NOTE_INDEX).operations(result));
log.info("createResponse.result{}", bulkResponse.hasFailures() ? "has failures" : "success"); log.info("createResponse.result{}", bulkResponse.toString());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -365,19 +335,16 @@ public class WebEsNoteServiceImpl extends ServiceImpl<WebNoteMapper, WebNote> im
public void delNoteBulkData() { public void delNoteBulkData() {
try { try {
// 删除索引 // 删除索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(NoteConstant.NOTE_INDEX); DeleteIndexRequest deleteIndexRequest = DeleteIndexRequest.of(builder -> builder.index(NoteConstant.NOTE_INDEX));
restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT); elasticsearchClient.indices().delete(deleteIndexRequest);
log.info("删除索引:{}", NoteConstant.NOTE_INDEX); log.info("删除索引:{}", NoteConstant.NOTE_INDEX);
} catch (Exception e) {
log.error("删除索引异常 (可能不存在): {}", NoteConstant.NOTE_INDEX);
}
try {
// 重新创建索引 // 重新创建索引
CreateIndexRequest createIndexRequest = new CreateIndexRequest(NoteConstant.NOTE_INDEX); CreateIndexRequest createIndexRequest = CreateIndexRequest.of(builder -> builder.index(NoteConstant.NOTE_INDEX));
restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT); elasticsearchClient.indices().create(createIndexRequest);
log.info("创建索引:{}", NoteConstant.NOTE_INDEX); log.info("创建索引:{}", NoteConstant.NOTE_INDEX);
} catch (Exception e) { } catch (Exception e) {
log.error("Error occurred while creating index: {}", NoteConstant.NOTE_INDEX, e); log.error("Error occurred while deleting and recreating index: {}", NoteConstant.NOTE_INDEX, e);
} }
} }

@ -1,32 +1,17 @@
package com.hongshu.web.service.impl; package com.hongshu.web.service.impl;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson2.JSON; import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.transport.endpoints.BooleanResponse;
import com.hongshu.common.constant.NoteConstant; import com.hongshu.common.constant.NoteConstant;
import com.hongshu.web.domain.dto.EsRecordDTO; import com.hongshu.web.domain.dto.EsRecordDTO;
import com.hongshu.web.domain.vo.RecordSearchVO; import com.hongshu.web.domain.vo.RecordSearchVO;
import com.hongshu.web.service.IWebEsRecordService; import com.hongshu.web.service.IWebEsRecordService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.reindex.BulkByScrollResponse;
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -43,7 +28,8 @@ import java.util.List;
public class WebEsRecordServiceImpl implements IWebEsRecordService { public class WebEsRecordServiceImpl implements IWebEsRecordService {
@Autowired @Autowired
private RestHighLevelClient restHighLevelClient; ElasticsearchClient elasticsearchClient;
/** /**
* *
@ -55,39 +41,35 @@ public class WebEsRecordServiceImpl implements IWebEsRecordService {
List<RecordSearchVO> records = new ArrayList<>(); List<RecordSearchVO> records = new ArrayList<>();
try { try {
SearchRequest searchRequest = new SearchRequest(NoteConstant.RECORD_INDEX); // 构建搜索请求
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); SearchRequest.Builder builder = new SearchRequest.Builder().index(NoteConstant.RECORD_INDEX);
// 添加查询条件根据uid过滤 // 添加查询条件根据uid过滤
if (StringUtils.isNotBlank(uid)) { if (StringUtils.isNotBlank(uid)) {
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); builder.query(q -> q.bool(b -> {
boolQuery.must(QueryBuilders.termQuery("uid", uid)); b.must(m -> m.term(t -> t.field("uid").value(uid)));
if (StringUtils.isNotBlank(keyword)) { if (StringUtils.isNotBlank(keyword)) {
boolQuery.must(QueryBuilders.matchQuery("content", keyword)); b.must(m -> m.match(f -> f.field("content").query(keyword)));
} }
sourceBuilder.query(boolQuery); return b;
}));
} }
// 设置排序规则和高亮显示 // 设置排序规则和高亮显示
sourceBuilder.sort("time", SortOrder.DESC); builder.sort(o -> o.field(f -> f.field("time").order(SortOrder.Desc)));
HighlightBuilder highlightBuilder = new HighlightBuilder(); builder.highlight(h -> h.fields("content", m -> m).preTags("<font color='black'>").postTags("</font>"));
highlightBuilder.field("content"); builder.size(10);
highlightBuilder.preTags("<font color='black'>");
highlightBuilder.postTags("</font>");
sourceBuilder.highlighter(highlightBuilder);
sourceBuilder.size(10);
searchRequest.source(sourceBuilder);
// 执行搜索请求 // 执行搜索请求
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); SearchRequest searchRequest = builder.build();
SearchResponse<RecordSearchVO> searchResponse = elasticsearchClient.search(searchRequest, RecordSearchVO.class);
// 获取搜索结果 // 获取搜索结果
SearchHit[] hits = searchResponse.getHits().getHits(); List<Hit<RecordSearchVO>> hits = searchResponse.hits().hits();
// 处理搜索结果 // 处理搜索结果
for (SearchHit hit : hits) { for (Hit<RecordSearchVO> hit : hits) {
RecordSearchVO recordSearchVo = JSON.parseObject(hit.getSourceAsString(), RecordSearchVO.class); RecordSearchVO recordSearchVo = hit.source();
records.add(recordSearchVo); records.add(recordSearchVo);
} }
@ -105,22 +87,20 @@ public class WebEsRecordServiceImpl implements IWebEsRecordService {
public List<RecordSearchVO> getHotRecord() { public List<RecordSearchVO> getHotRecord() {
List<RecordSearchVO> records = new ArrayList<>(); List<RecordSearchVO> records = new ArrayList<>();
try { try {
GetIndexRequest getIndexRequest = new GetIndexRequest(NoteConstant.RECORD_INDEX); BooleanResponse exists = elasticsearchClient.indices().exists(e -> e
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT); .index(NoteConstant.RECORD_INDEX));
if (!exists) { if (!exists.value()) {
return records; return records;
} }
SearchRequest.Builder builder = new SearchRequest.Builder().index(NoteConstant.RECORD_INDEX);
SearchRequest searchRequest = new SearchRequest(NoteConstant.RECORD_INDEX); builder.sort(o -> o.field(f -> f.field("searchCount").order(SortOrder.Desc)));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); builder.size(10);
sourceBuilder.sort("searchCount", SortOrder.DESC); SearchRequest searchRequest = builder.build();
sourceBuilder.size(10); SearchResponse<RecordSearchVO> searchResponse = elasticsearchClient.search(searchRequest, RecordSearchVO.class);
searchRequest.source(sourceBuilder); //得到所有的数据
List<Hit<RecordSearchVO>> hits = searchResponse.hits().hits();
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); for (Hit<RecordSearchVO> hit : hits) {
SearchHit[] hits = searchResponse.getHits().getHits(); RecordSearchVO recordSearchVo = hit.source();
for (SearchHit hit : hits) {
RecordSearchVO recordSearchVo = JSON.parseObject(hit.getSourceAsString(), RecordSearchVO.class);
records.add(recordSearchVo); records.add(recordSearchVo);
} }
return records; return records;
@ -139,47 +119,36 @@ public class WebEsRecordServiceImpl implements IWebEsRecordService {
String uid = esRecordDTO.getUid(); String uid = esRecordDTO.getUid();
try { try {
// 查询索引是否存在 // 查询索引是否存在
GetIndexRequest getIndexRequest = new GetIndexRequest(NoteConstant.RECORD_INDEX); BooleanResponse exists = elasticsearchClient.indices().exists(e -> e
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT); .index(NoteConstant.RECORD_INDEX));
if (!exists) { if (!exists.value()) {
CreateIndexRequest createIndexRequest = new CreateIndexRequest(NoteConstant.RECORD_INDEX); elasticsearchClient.indices().create(c -> c.index(NoteConstant.RECORD_INDEX));
restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
} }
SearchRequest.Builder builder = new SearchRequest.Builder().index(NoteConstant.RECORD_INDEX);
SearchRequest searchRequest = new SearchRequest(NoteConstant.RECORD_INDEX);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
if (StringUtils.isNotBlank(keyword)) { if (StringUtils.isNotBlank(keyword)) {
sourceBuilder.query(QueryBuilders.matchQuery("content", keyword.trim())); builder.query(q -> q.match(f -> f.field("content").query(keyword.trim())));
} }
sourceBuilder.size(10); builder.size(10);
searchRequest.source(sourceBuilder); SearchRequest searchRequest = builder.build();
SearchResponse<RecordSearchVO> searchResponse = elasticsearchClient.search(searchRequest, RecordSearchVO.class);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); //得到所有的数据
SearchHit[] hits = searchResponse.getHits().getHits(); List<Hit<RecordSearchVO>> hits = searchResponse.hits().hits();
List<String> contents = new ArrayList<>(); List<String> contents = new ArrayList<>();
for (SearchHit hit : hits) { // 高亮查询
RecordSearchVO recordSearchVo = JSON.parseObject(hit.getSourceAsString(), RecordSearchVO.class); for (Hit<RecordSearchVO> hit : hits) {
RecordSearchVO recordSearchVo = hit.source();
recordSearchVo.setSearchCount(recordSearchVo.getSearchCount() + 1); recordSearchVo.setSearchCount(recordSearchVo.getSearchCount() + 1);
UpdateResponse<RecordSearchVO> response = elasticsearchClient.update(u -> u.index(NoteConstant.RECORD_INDEX).id(hit.id()).doc(recordSearchVo), RecordSearchVO.class);
UpdateRequest updateRequest = new UpdateRequest(NoteConstant.RECORD_INDEX, hit.getId()) log.info("response", response.toString());
.doc(JSON.toJSONString(recordSearchVo), XContentType.JSON);
UpdateResponse response = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
log.info("response {}", response.toString());
contents.add(recordSearchVo.getContent()); contents.add(recordSearchVo.getContent());
} }
if (StringUtils.isNotBlank(keyword) && !contents.contains(keyword.trim())) { if (StringUtils.isNotBlank(keyword) && !contents.contains(keyword.trim())) {
RecordSearchVO recordSearchVo = new RecordSearchVO(); RecordSearchVO recordSearchVo = new RecordSearchVO();
recordSearchVo.setContent(keyword); recordSearchVo.setContent(keyword);
recordSearchVo.setSearchCount(1L); recordSearchVo.setSearchCount(1L);
recordSearchVo.setUid(uid);
String id = RandomUtil.randomString(12); String id = RandomUtil.randomString(12);
elasticsearchClient.create(c -> c.index(NoteConstant.RECORD_INDEX).id(id).document(recordSearchVo));
IndexRequest indexRequest = new IndexRequest(NoteConstant.RECORD_INDEX)
.id(id)
.source(JSON.toJSONString(recordSearchVo), XContentType.JSON);
restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -196,31 +165,35 @@ public class WebEsRecordServiceImpl implements IWebEsRecordService {
try { try {
// 检查索引是否存在 // 检查索引是否存在
GetIndexRequest getIndexRequest = new GetIndexRequest(NoteConstant.RECORD_INDEX); BooleanResponse exists = elasticsearchClient.indices().exists(e -> e
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT); .index(NoteConstant.RECORD_INDEX));
if (!exists) { if (!exists.value()) {
log.warn("Index does not exist. No records to clear."); log.warn("Index does not exist. No records to clear.");
return; return;
} }
// 构建删除请求 // 构建删除请求
DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(NoteConstant.RECORD_INDEX); DeleteByQueryRequest.Builder deleteRequestBuilder = new DeleteByQueryRequest.Builder()
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); .index(NoteConstant.RECORD_INDEX)
boolQuery.must(QueryBuilders.termQuery("uid", uid)); .query(q -> q.bool(b -> {
if (StringUtils.isNotBlank(keyword)) { b.must(m -> m.term(t -> t.field("uid").value(uid)));
boolQuery.must(QueryBuilders.termQuery("content.keyword", keyword.trim())); if (StringUtils.isNotBlank(keyword)) {
} b.must(m -> m.term(t -> t.field("content.keyword").value(keyword.trim())));
deleteByQueryRequest.setQuery(boolQuery); }
return b;
}));
// 执行删除操作 // 执行删除操作
BulkByScrollResponse deleteResponse = restHighLevelClient.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT); DeleteByQueryResponse deleteResponse = elasticsearchClient.deleteByQuery(deleteRequestBuilder.build());
log.info("Deleted {} records for uid: {}", deleteResponse.getDeleted(), uid);
log.info("Deleted {} records for uid: {}", deleteResponse.deleted(), uid);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
/** /**
* *
*/ */
@ -228,15 +201,13 @@ public class WebEsRecordServiceImpl implements IWebEsRecordService {
public void clearAllRecord() { public void clearAllRecord() {
try { try {
// 检查索引是否存在 // 检查索引是否存在
GetIndexRequest getIndexRequest = new GetIndexRequest(NoteConstant.RECORD_INDEX); BooleanResponse exists = elasticsearchClient.indices().exists(e -> e
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT); .index(NoteConstant.RECORD_INDEX));
if (exists) { if (exists.value()) {
// 删除整个索引 // 删除整个索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(NoteConstant.RECORD_INDEX); elasticsearchClient.indices().delete(d -> d.index(NoteConstant.RECORD_INDEX));
restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
// 重新创建索引 // 重新创建索引
CreateIndexRequest createIndexRequest = new CreateIndexRequest(NoteConstant.RECORD_INDEX); elasticsearchClient.indices().create(c -> c.index(NoteConstant.RECORD_INDEX));
restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
log.info("All search records have been cleared."); log.info("All search records have been cleared.");
} else { } else {
log.warn("Index does not exist. No records to clear."); log.warn("Index does not exist. No records to clear.");

@ -25,7 +25,7 @@
<hongshu.version>1.0.0</hongshu.version> <hongshu.version>1.0.0</hongshu.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version> <java.version>17</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version> <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<spring-framework.version>5.3.33</spring-framework.version> <spring-framework.version>5.3.33</spring-framework.version>
<druid.version>1.2.20</druid.version> <druid.version>1.2.20</druid.version>
@ -41,7 +41,7 @@
<jwt.version>0.9.1</jwt.version> <jwt.version>0.9.1</jwt.version>
<lombok.version>1.18.24</lombok.version> <lombok.version>1.18.24</lombok.version>
<hutool.version>5.7.22</hutool.version> <hutool.version>5.7.22</hutool.version>
<elasticsearch.version>7.12.1</elasticsearch.version> <elasticsearch.version>9.0.1</elasticsearch.version>
<guava.version>20.0</guava.version> <guava.version>20.0</guava.version>
<gson.version>2.9.0</gson.version> <gson.version>2.9.0</gson.version>
<mybatisplus.version>3.5.2</mybatisplus.version> <mybatisplus.version>3.5.2</mybatisplus.version>
@ -153,11 +153,26 @@
<version>${hutool.version}</version> <version>${hutool.version}</version>
</dependency> </dependency>
<!-- elasticsearch--> <!-- elasticsearch-->
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.elasticsearch.client</groupId> <groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId> <artifactId>elasticsearch-rest-client</artifactId>
<version>${elasticsearch.version}</version> <version>${elasticsearch.version}</version>
</dependency> </dependency>
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.parsson</groupId>
<artifactId>parsson</artifactId>
<version>1.0.5</version>
</dependency>
<!-- guava--> <!-- guava-->
<dependency> <dependency>

Loading…
Cancel
Save