diff --git a/hongshu-common/pom.xml b/hongshu-common/pom.xml index 5e48d80..17cebef 100644 --- a/hongshu-common/pom.xml +++ b/hongshu-common/pom.xml @@ -130,21 +130,9 @@ hutool-all - - co.elastic.clients - elasticsearch-java - org.elasticsearch.client - elasticsearch-rest-client - - - jakarta.json - jakarta.json-api - - - org.eclipse.parsson - parsson + elasticsearch-rest-high-level-client diff --git a/hongshu-common/src/main/java/com/hongshu/common/config/es/ESConfig.java b/hongshu-common/src/main/java/com/hongshu/common/config/es/ESConfig.java index d2fdf41..238ff70 100644 --- a/hongshu-common/src/main/java/com/hongshu/common/config/es/ESConfig.java +++ b/hongshu-common/src/main/java/com/hongshu/common/config/es/ESConfig.java @@ -1,9 +1,5 @@ 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 org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; @@ -11,6 +7,8 @@ import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; 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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -36,42 +34,29 @@ public class ESConfig { @Value("${es.password}") String password; - private RestClient restClient; - private ElasticsearchClient client; - - private ElasticsearchTransport transport; + private RestHighLevelClient client; @Bean(name = "elasticsearchClient") - public ElasticsearchClient getElasticsearchClient() { + public RestHighLevelClient getElasticsearchClient() { // 设置用户名和密码 final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); // 创建带有基本身份验证的 RestClient - restClient = RestClient.builder( - new HttpHost(esUrl, esPort) - ) + RestClientBuilder builder = RestClient.builder(new HttpHost(esUrl, esPort)) .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider) - ) - .build(); - - // 使用 Jackson 映射器创建传输层 - transport = new RestClientTransport( - restClient, new JacksonJsonpMapper() - ); + ); // 创建 API 客户端 - client = new ElasticsearchClient(transport); + client = new RestHighLevelClient(builder); return client; } - public void close() { if (client != null) { try { - transport.close(); - restClient.close(); + client.close(); } catch (IOException e) { log.error("关闭es连接异常"); } diff --git a/hongshu-web/src/main/java/com/hongshu/web/service/impl/WebBrowseRecordServiceImpl.java b/hongshu-web/src/main/java/com/hongshu/web/service/impl/WebBrowseRecordServiceImpl.java index 4e079dd..56e4ad6 100644 --- a/hongshu-web/src/main/java/com/hongshu/web/service/impl/WebBrowseRecordServiceImpl.java +++ b/hongshu-web/src/main/java/com/hongshu/web/service/impl/WebBrowseRecordServiceImpl.java @@ -1,9 +1,7 @@ package com.hongshu.web.service.impl; import cn.hutool.core.collection.CollectionUtil; -import co.elastic.clients.elasticsearch.ElasticsearchClient; -import co.elastic.clients.elasticsearch.core.GetResponse; -import co.elastic.clients.elasticsearch.core.UpdateResponse; +import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hongshu.common.constant.NoteConstant; @@ -20,6 +18,12 @@ import com.hongshu.web.mapper.WebUserMapper; import com.hongshu.web.mapper.WebUserNoteRelationMapper; import com.hongshu.web.service.IWebBrowseRecordService; 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.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -44,7 +48,7 @@ public class WebBrowseRecordServiceImpl extends ServiceImpl getResponse = elasticsearchClient.get(g -> - g.index(NoteConstant.NOTE_INDEX) - .id(browseRecordDTO.getNid()), - NoteSearchVO.class); + GetRequest getRequest = new GetRequest(NoteConstant.NOTE_INDEX, browseRecordDTO.getNid()); + GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT); + // 检查是否获取到了数据 - if (getResponse.found()) { - NoteSearchVO noteSearchVo = getResponse.source(); + if (getResponse.isExists()) { + NoteSearchVO noteSearchVo = JSON.parseObject(getResponse.getSourceAsString(), NoteSearchVO.class); // Step 2: 更新 viewCount 字段 noteSearchVo.setViewCount(noteSearchVo.getViewCount() + 1); // Step 3: 将更新后的数据保存回 Elasticsearch - UpdateResponse updateResponse = elasticsearchClient.update(u -> - u.index(NoteConstant.NOTE_INDEX) - .id(browseRecordDTO.getNid()) - .doc(noteSearchVo), - NoteSearchVO.class); + UpdateRequest updateRequest = new UpdateRequest(NoteConstant.NOTE_INDEX, browseRecordDTO.getNid()) + .doc(JSON.toJSONString(noteSearchVo), XContentType.JSON); + restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT); } } catch (Exception e) { e.printStackTrace(); @@ -158,4 +159,4 @@ public class WebBrowseRecordServiceImpl extends ServiceImpl im @Autowired private WebNoteMapper noteMapper; @Autowired - private ElasticsearchClient elasticsearchClient; + private RestHighLevelClient restHighLevelClient; @Autowired private WebLikeOrCollectMapper likeOrCollectionMapper; @@ -71,40 +84,48 @@ public class WebEsNoteServiceImpl extends ServiceImpl im Page page = new Page<>(); List noteSearchVOList = new ArrayList<>(); try { - SearchRequest.Builder builder = new SearchRequest.Builder().index(NoteConstant.NOTE_INDEX); + SearchRequest searchRequest = new SearchRequest(NoteConstant.NOTE_INDEX); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + BoolQueryBuilder mainQuery = QueryBuilders.boolQuery(); + if (StringUtils.isNotBlank(esNoteDTO.getKeyword())) { - builder.query(q -> q.bool(b -> b - .should(h -> h.match(f -> f.field("title").boost(1f).query(esNoteDTO.getKeyword()))) - .should(h -> h.match(f -> f.field("username").boost(0.5f).query(esNoteDTO.getKeyword()))) - .should(h -> h.match(f -> f.field("content").boost(1f).query(esNoteDTO.getKeyword()))) - .should(h -> h.match(f -> f.field("tags").boost(4f).query(esNoteDTO.getKeyword()))) - .should(h -> h.match(f -> f.field("categoryName").boost(2f).query(esNoteDTO.getKeyword()))) - .should(h -> h.match(f -> f.field("categoryParentName").boost(1.5f).query(esNoteDTO.getKeyword()))) - )); + BoolQueryBuilder keywordQuery = QueryBuilders.boolQuery() + .should(QueryBuilders.matchQuery("title", esNoteDTO.getKeyword()).boost(1f)) + .should(QueryBuilders.matchQuery("username", esNoteDTO.getKeyword()).boost(0.5f)) + .should(QueryBuilders.matchQuery("content", esNoteDTO.getKeyword()).boost(1f)) + .should(QueryBuilders.matchQuery("tags", esNoteDTO.getKeyword()).boost(4f)) + .should(QueryBuilders.matchQuery("categoryName", esNoteDTO.getKeyword()).boost(2f)) + .should(QueryBuilders.matchQuery("categoryParentName", esNoteDTO.getKeyword()).boost(1.5f)); + mainQuery.must(keywordQuery); } + if (StringUtils.isNotBlank(esNoteDTO.getCpid()) && StringUtils.isNotBlank(esNoteDTO.getCid())) { - builder.query(q -> q.bool(b -> b - .must(h -> h.match(m -> m.field("cid").query(esNoteDTO.getCid()))) - .must(h -> h.match(m -> m.field("cpid").query(esNoteDTO.getCpid()))) - )); + mainQuery.must(QueryBuilders.matchQuery("cid", esNoteDTO.getCid())) + .must(QueryBuilders.matchQuery("cpid", esNoteDTO.getCpid())); } else if (StringUtils.isNotBlank(esNoteDTO.getCpid())) { - builder.query(h -> h.match(m -> m.field("cpid").query(esNoteDTO.getCpid()))); + mainQuery.must(QueryBuilders.matchQuery("cpid", esNoteDTO.getCpid())); + } + + if (mainQuery.hasClauses()) { + sourceBuilder.query(mainQuery); } if (esNoteDTO.getType() == 1) { - builder.sort(o -> o.field(f -> f.field("likeCount").order(SortOrder.Desc))); + sourceBuilder.sort("likeCount", SortOrder.DESC); } else if (esNoteDTO.getType() == 2) { - builder.sort(o -> o.field(f -> f.field("time").order(SortOrder.Desc))); + sourceBuilder.sort("time", SortOrder.DESC); } - builder.from((int) (currentPage - 1) * (int) pageSize); - builder.size((int) pageSize); - SearchRequest searchRequest = builder.build(); - SearchResponse searchResponse = elasticsearchClient.search(searchRequest, NoteSearchVO.class); - TotalHits totalHits = searchResponse.hits().total(); - page.setTotal(Objects.requireNonNull(totalHits).value()); - List> hits = searchResponse.hits().hits(); - for (Hit hit : hits) { - NoteSearchVO noteSearchVo = hit.source(); + + sourceBuilder.from((int) (currentPage - 1) * (int) pageSize); + sourceBuilder.size((int) pageSize); + searchRequest.source(sourceBuilder); + + SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + long totalHits = searchResponse.getHits().getTotalHits().value; + page.setTotal(totalHits); + + for (SearchHit hit : searchResponse.getHits().getHits()) { + NoteSearchVO noteSearchVo = JSON.parseObject(hit.getSourceAsString(), NoteSearchVO.class); noteSearchVOList.add(noteSearchVo); } } catch (Exception e) { @@ -139,23 +160,25 @@ public class WebEsNoteServiceImpl extends ServiceImpl im List noteSearchVOList = new ArrayList<>(); //得到当前用户的浏览记录 try { - SearchRequest.Builder builder = new SearchRequest.Builder().index(NoteConstant.NOTE_INDEX); - builder.size(1000); - SearchRequest searchRequest = builder.build(); - SearchResponse searchResponse = elasticsearchClient.search(searchRequest, NoteSearchVO.class); - TotalHits totalHits = searchResponse.hits().total(); - //得到所有的数据 - List> hits = searchResponse.hits().hits(); - if (CollectionUtil.isNotEmpty(hits)) { - for (Hit hit : hits) { - NoteSearchVO noteSearchVo = hit.source(); + SearchRequest searchRequest = new SearchRequest(NoteConstant.NOTE_INDEX); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + sourceBuilder.size(1000); + searchRequest.source(sourceBuilder); + + SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + long totalHits = searchResponse.getHits().getTotalHits().value; + + SearchHit[] hits = searchResponse.getHits().getHits(); + if (hits.length > 0) { + for (SearchHit hit : hits) { + NoteSearchVO noteSearchVo = JSON.parseObject(hit.getSourceAsString(), NoteSearchVO.class); noteSearchVOList.add(noteSearchVo); } Collections.shuffle(noteSearchVOList); List> partition = Lists.partition(noteSearchVOList, (int) pageSize); List noteSearchVOS = partition.get((int) currentPage - 1); - page.setTotal(totalHits != null ? totalHits.value() : 0); + page.setTotal(totalHits); page.setRecords(noteSearchVOS); } } catch (Exception e) { @@ -176,15 +199,19 @@ public class WebEsNoteServiceImpl extends ServiceImpl im Page page = new Page<>(); String userId = WebUtils.getRequestHeader(UserConstant.USER_ID); // 用户ID为空 默认随机加载100条数据 - List recommendList = null; + List recommendList = new ArrayList<>(); if (StringUtils.isBlank(userId)) { - SearchRequest searchRequest = SearchRequest.of(s -> s - .index(NoteConstant.NOTE_INDEX) - .size(100)); - SearchResponse searchResponse = elasticsearchClient.search(searchRequest, WebUser.class); - recommendList = searchResponse.hits().hits().stream() - .map(Hit::source) - .collect(Collectors.toList()); + SearchRequest searchRequest = new SearchRequest(NoteConstant.NOTE_INDEX); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + sourceBuilder.size(100); + searchRequest.source(sourceBuilder); + + SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + + for (SearchHit hit : searchResponse.getHits().getHits()) { + WebUser user = JSON.parseObject(hit.getSourceAsString(), WebUser.class); + recommendList.add(user); + } // 随机排序 Collections.shuffle(recommendList, new Random()); } else { @@ -198,6 +225,7 @@ public class WebEsNoteServiceImpl extends ServiceImpl im page.setRecords(Collections.emptyList()); return page; } + List userList = partition.get((int) currentPage - 1); page.setTotal(recommendList.size()); page.setRecords(userList); @@ -216,35 +244,29 @@ public class WebEsNoteServiceImpl extends ServiceImpl im List noteSearchVOList = new ArrayList<>(); try { - // 构建搜索请求 - SearchRequest.Builder builder = new SearchRequest.Builder() - .index(NoteConstant.NOTE_INDEX) - .from(Math.toIntExact((currentPage - 1) * pageSize)) // 设置分页起始点 - .size(Math.toIntExact(pageSize)) // 设置分页大小 - .sort(s -> s.field(f -> f.field("likeCount").order(SortOrder.Desc))); // 按 likeCount 降序排序 - - SearchRequest searchRequest = builder.build(); - - // 执行搜索请求 - SearchResponse searchResponse = elasticsearchClient.search(searchRequest, NoteSearchVO.class); - TotalHits totalHits = searchResponse.hits().total(); - - // 获取搜索结果 - List> hits = searchResponse.hits().hits(); - if (CollectionUtil.isNotEmpty(hits)) { - for (Hit hit : hits) { - NoteSearchVO noteSearchVo = hit.source(); + SearchRequest searchRequest = new SearchRequest(NoteConstant.NOTE_INDEX); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + sourceBuilder.from(Math.toIntExact((currentPage - 1) * pageSize)); + sourceBuilder.size(Math.toIntExact(pageSize)); + sourceBuilder.sort("likeCount", SortOrder.DESC); + searchRequest.source(sourceBuilder); + + SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + long totalHits = searchResponse.getHits().getTotalHits().value; + + SearchHit[] hits = searchResponse.getHits().getHits(); + if (hits.length > 0) { + for (SearchHit hit : hits) { + NoteSearchVO noteSearchVo = JSON.parseObject(hit.getSourceAsString(), NoteSearchVO.class); noteSearchVOList.add(noteSearchVo); } } - // 设置分页结果 - page.setTotal(totalHits != null ? totalHits.value() : 0); + page.setTotal(totalHits); page.setRecords(noteSearchVOList); } catch (Exception e) { e.printStackTrace(); - // 这里可以进一步处理异常,比如记录日志或者抛出自定义异常 } return page; } @@ -257,8 +279,11 @@ public class WebEsNoteServiceImpl extends ServiceImpl im @Override public void addNote(NoteSearchVO noteSearchVo) { try { - CreateResponse createResponse = elasticsearchClient.create(e -> e.index(NoteConstant.NOTE_INDEX).id(noteSearchVo.getId()).document(noteSearchVo)); - log.info("createResponse.result{}", createResponse.result()); + IndexRequest indexRequest = new IndexRequest(NoteConstant.NOTE_INDEX) + .id(noteSearchVo.getId()) + .source(JSON.toJSONString(noteSearchVo), XContentType.JSON); + IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT); + log.info("indexResponse.result{}", indexResponse.getResult()); } catch (Exception e) { e.printStackTrace(); } @@ -272,8 +297,10 @@ public class WebEsNoteServiceImpl extends ServiceImpl im @Override public void updateNote(NoteSearchVO noteSearchVo) { try { - UpdateResponse updateResponse = elasticsearchClient.update(e -> e.index(NoteConstant.NOTE_INDEX).id(noteSearchVo.getId()).doc(noteSearchVo), NoteSearchVO.class); - log.info("updateResponse.result() = " + updateResponse.result()); + UpdateRequest updateRequest = new UpdateRequest(NoteConstant.NOTE_INDEX, noteSearchVo.getId()) + .doc(JSON.toJSONString(noteSearchVo), XContentType.JSON); + UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT); + log.info("updateResponse.result() = " + updateResponse.getResult()); } catch (Exception e) { e.printStackTrace(); } @@ -287,8 +314,9 @@ public class WebEsNoteServiceImpl extends ServiceImpl im @Override public void deleteNote(String noteId) { try { - DeleteResponse deleteResponse = elasticsearchClient.delete(e -> e.index(NoteConstant.NOTE_INDEX).id(String.valueOf(noteId))); - log.info("deleteResponse.result() ={} ", deleteResponse.result()); + DeleteRequest deleteRequest = new DeleteRequest(NoteConstant.NOTE_INDEX, String.valueOf(noteId)); + DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT); + log.info("deleteResponse.result() ={} ", deleteResponse.getResult()); } catch (Exception e) { e.printStackTrace(); } @@ -316,13 +344,15 @@ public class WebEsNoteServiceImpl extends ServiceImpl im noteSearchVo.setIsLike(likeOrCollectionIds.contains(noteSearchVo.getId())); } try { - List result = new ArrayList<>(); + BulkRequest bulkRequest = new BulkRequest(); for (NoteSearchVO noteSearchVo : noteSearchVOList) { - result.add(new BulkOperation.Builder().create( - d -> d.document(noteSearchVo).id(noteSearchVo.getId()).index(NoteConstant.NOTE_INDEX)).build()); + IndexRequest indexRequest = new IndexRequest(NoteConstant.NOTE_INDEX) + .id(noteSearchVo.getId()) + .source(JSON.toJSONString(noteSearchVo), XContentType.JSON); + bulkRequest.add(indexRequest); } - BulkResponse bulkResponse = elasticsearchClient.bulk(e -> e.index(NoteConstant.NOTE_INDEX).operations(result)); - log.info("createResponse.result{}", bulkResponse.toString()); + BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT); + log.info("createResponse.result{}", bulkResponse.hasFailures() ? "has failures" : "success"); } catch (Exception e) { e.printStackTrace(); } @@ -335,16 +365,19 @@ public class WebEsNoteServiceImpl extends ServiceImpl im public void delNoteBulkData() { try { // 删除索引 - DeleteIndexRequest deleteIndexRequest = DeleteIndexRequest.of(builder -> builder.index(NoteConstant.NOTE_INDEX)); - elasticsearchClient.indices().delete(deleteIndexRequest); + DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(NoteConstant.NOTE_INDEX); + restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT); log.info("删除索引:{}", NoteConstant.NOTE_INDEX); - + } catch (Exception e) { + log.error("删除索引异常 (可能不存在): {}", NoteConstant.NOTE_INDEX); + } + try { // 重新创建索引 - CreateIndexRequest createIndexRequest = CreateIndexRequest.of(builder -> builder.index(NoteConstant.NOTE_INDEX)); - elasticsearchClient.indices().create(createIndexRequest); + CreateIndexRequest createIndexRequest = new CreateIndexRequest(NoteConstant.NOTE_INDEX); + restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT); log.info("创建索引:{}", NoteConstant.NOTE_INDEX); } catch (Exception e) { - log.error("Error occurred while deleting and recreating index: {}", NoteConstant.NOTE_INDEX, e); + log.error("Error occurred while creating index: {}", NoteConstant.NOTE_INDEX, e); } } diff --git a/hongshu-web/src/main/java/com/hongshu/web/service/impl/WebEsRecordServiceImpl.java b/hongshu-web/src/main/java/com/hongshu/web/service/impl/WebEsRecordServiceImpl.java index af7c5f6..379b383 100644 --- a/hongshu-web/src/main/java/com/hongshu/web/service/impl/WebEsRecordServiceImpl.java +++ b/hongshu-web/src/main/java/com/hongshu/web/service/impl/WebEsRecordServiceImpl.java @@ -1,17 +1,32 @@ package com.hongshu.web.service.impl; import cn.hutool.core.util.RandomUtil; -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.alibaba.fastjson2.JSON; import com.hongshu.common.constant.NoteConstant; import com.hongshu.web.domain.dto.EsRecordDTO; import com.hongshu.web.domain.vo.RecordSearchVO; import com.hongshu.web.service.IWebEsRecordService; import lombok.extern.slf4j.Slf4j; 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.stereotype.Service; @@ -28,8 +43,7 @@ import java.util.List; public class WebEsRecordServiceImpl implements IWebEsRecordService { @Autowired - ElasticsearchClient elasticsearchClient; - + private RestHighLevelClient restHighLevelClient; /** * 获取搜索记录 @@ -41,35 +55,39 @@ public class WebEsRecordServiceImpl implements IWebEsRecordService { List records = new ArrayList<>(); try { - // 构建搜索请求 - SearchRequest.Builder builder = new SearchRequest.Builder().index(NoteConstant.RECORD_INDEX); + SearchRequest searchRequest = new SearchRequest(NoteConstant.RECORD_INDEX); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 添加查询条件,根据uid过滤 if (StringUtils.isNotBlank(uid)) { - builder.query(q -> q.bool(b -> { - b.must(m -> m.term(t -> t.field("uid").value(uid))); - if (StringUtils.isNotBlank(keyword)) { - b.must(m -> m.match(f -> f.field("content").query(keyword))); - } - return b; - })); + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + boolQuery.must(QueryBuilders.termQuery("uid", uid)); + if (StringUtils.isNotBlank(keyword)) { + boolQuery.must(QueryBuilders.matchQuery("content", keyword)); + } + sourceBuilder.query(boolQuery); } // 设置排序规则和高亮显示 - builder.sort(o -> o.field(f -> f.field("time").order(SortOrder.Desc))); - builder.highlight(h -> h.fields("content", m -> m).preTags("").postTags("")); - builder.size(10); + sourceBuilder.sort("time", SortOrder.DESC); + HighlightBuilder highlightBuilder = new HighlightBuilder(); + highlightBuilder.field("content"); + highlightBuilder.preTags(""); + highlightBuilder.postTags(""); + sourceBuilder.highlighter(highlightBuilder); + sourceBuilder.size(10); + + searchRequest.source(sourceBuilder); // 执行搜索请求 - SearchRequest searchRequest = builder.build(); - SearchResponse searchResponse = elasticsearchClient.search(searchRequest, RecordSearchVO.class); + SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); // 获取搜索结果 - List> hits = searchResponse.hits().hits(); + SearchHit[] hits = searchResponse.getHits().getHits(); // 处理搜索结果 - for (Hit hit : hits) { - RecordSearchVO recordSearchVo = hit.source(); + for (SearchHit hit : hits) { + RecordSearchVO recordSearchVo = JSON.parseObject(hit.getSourceAsString(), RecordSearchVO.class); records.add(recordSearchVo); } @@ -87,20 +105,22 @@ public class WebEsRecordServiceImpl implements IWebEsRecordService { public List getHotRecord() { List records = new ArrayList<>(); try { - BooleanResponse exists = elasticsearchClient.indices().exists(e -> e - .index(NoteConstant.RECORD_INDEX)); - if (!exists.value()) { + GetIndexRequest getIndexRequest = new GetIndexRequest(NoteConstant.RECORD_INDEX); + boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT); + if (!exists) { return records; } - SearchRequest.Builder builder = new SearchRequest.Builder().index(NoteConstant.RECORD_INDEX); - builder.sort(o -> o.field(f -> f.field("searchCount").order(SortOrder.Desc))); - builder.size(10); - SearchRequest searchRequest = builder.build(); - SearchResponse searchResponse = elasticsearchClient.search(searchRequest, RecordSearchVO.class); - //得到所有的数据 - List> hits = searchResponse.hits().hits(); - for (Hit hit : hits) { - RecordSearchVO recordSearchVo = hit.source(); + + SearchRequest searchRequest = new SearchRequest(NoteConstant.RECORD_INDEX); + SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); + sourceBuilder.sort("searchCount", SortOrder.DESC); + sourceBuilder.size(10); + searchRequest.source(sourceBuilder); + + SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + SearchHit[] hits = searchResponse.getHits().getHits(); + for (SearchHit hit : hits) { + RecordSearchVO recordSearchVo = JSON.parseObject(hit.getSourceAsString(), RecordSearchVO.class); records.add(recordSearchVo); } return records; @@ -119,36 +139,47 @@ public class WebEsRecordServiceImpl implements IWebEsRecordService { String uid = esRecordDTO.getUid(); try { // 查询索引是否存在 - BooleanResponse exists = elasticsearchClient.indices().exists(e -> e - .index(NoteConstant.RECORD_INDEX)); - if (!exists.value()) { - elasticsearchClient.indices().create(c -> c.index(NoteConstant.RECORD_INDEX)); + GetIndexRequest getIndexRequest = new GetIndexRequest(NoteConstant.RECORD_INDEX); + boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT); + if (!exists) { + CreateIndexRequest createIndexRequest = new CreateIndexRequest(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)) { - builder.query(q -> q.match(f -> f.field("content").query(keyword.trim()))); + sourceBuilder.query(QueryBuilders.matchQuery("content", keyword.trim())); } - builder.size(10); - SearchRequest searchRequest = builder.build(); - SearchResponse searchResponse = elasticsearchClient.search(searchRequest, RecordSearchVO.class); - //得到所有的数据 - List> hits = searchResponse.hits().hits(); + sourceBuilder.size(10); + searchRequest.source(sourceBuilder); + + SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); + SearchHit[] hits = searchResponse.getHits().getHits(); List contents = new ArrayList<>(); - // 高亮查询 - for (Hit hit : hits) { - RecordSearchVO recordSearchVo = hit.source(); + for (SearchHit hit : hits) { + RecordSearchVO recordSearchVo = JSON.parseObject(hit.getSourceAsString(), RecordSearchVO.class); recordSearchVo.setSearchCount(recordSearchVo.getSearchCount() + 1); - UpdateResponse response = elasticsearchClient.update(u -> u.index(NoteConstant.RECORD_INDEX).id(hit.id()).doc(recordSearchVo), RecordSearchVO.class); - log.info("response", response.toString()); + + UpdateRequest updateRequest = new UpdateRequest(NoteConstant.RECORD_INDEX, hit.getId()) + .doc(JSON.toJSONString(recordSearchVo), XContentType.JSON); + UpdateResponse response = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT); + log.info("response {}", response.toString()); contents.add(recordSearchVo.getContent()); } + if (StringUtils.isNotBlank(keyword) && !contents.contains(keyword.trim())) { RecordSearchVO recordSearchVo = new RecordSearchVO(); recordSearchVo.setContent(keyword); recordSearchVo.setSearchCount(1L); + recordSearchVo.setUid(uid); 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) { e.printStackTrace(); @@ -165,35 +196,31 @@ public class WebEsRecordServiceImpl implements IWebEsRecordService { try { // 检查索引是否存在 - BooleanResponse exists = elasticsearchClient.indices().exists(e -> e - .index(NoteConstant.RECORD_INDEX)); - if (!exists.value()) { + GetIndexRequest getIndexRequest = new GetIndexRequest(NoteConstant.RECORD_INDEX); + boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT); + if (!exists) { log.warn("Index does not exist. No records to clear."); return; } // 构建删除请求 - DeleteByQueryRequest.Builder deleteRequestBuilder = new DeleteByQueryRequest.Builder() - .index(NoteConstant.RECORD_INDEX) - .query(q -> q.bool(b -> { - b.must(m -> m.term(t -> t.field("uid").value(uid))); - if (StringUtils.isNotBlank(keyword)) { - b.must(m -> m.term(t -> t.field("content.keyword").value(keyword.trim()))); - } - return b; - })); + DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(NoteConstant.RECORD_INDEX); + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + boolQuery.must(QueryBuilders.termQuery("uid", uid)); + if (StringUtils.isNotBlank(keyword)) { + boolQuery.must(QueryBuilders.termQuery("content.keyword", keyword.trim())); + } + deleteByQueryRequest.setQuery(boolQuery); // 执行删除操作 - DeleteByQueryResponse deleteResponse = elasticsearchClient.deleteByQuery(deleteRequestBuilder.build()); - - log.info("Deleted {} records for uid: {}", deleteResponse.deleted(), uid); + BulkByScrollResponse deleteResponse = restHighLevelClient.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT); + log.info("Deleted {} records for uid: {}", deleteResponse.getDeleted(), uid); } catch (Exception e) { e.printStackTrace(); } } - /** * 清空搜索记录 */ @@ -201,13 +228,15 @@ public class WebEsRecordServiceImpl implements IWebEsRecordService { public void clearAllRecord() { try { // 检查索引是否存在 - BooleanResponse exists = elasticsearchClient.indices().exists(e -> e - .index(NoteConstant.RECORD_INDEX)); - if (exists.value()) { + GetIndexRequest getIndexRequest = new GetIndexRequest(NoteConstant.RECORD_INDEX); + boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT); + if (exists) { // 删除整个索引 - elasticsearchClient.indices().delete(d -> d.index(NoteConstant.RECORD_INDEX)); + DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(NoteConstant.RECORD_INDEX); + restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT); // 重新创建索引 - elasticsearchClient.indices().create(c -> c.index(NoteConstant.RECORD_INDEX)); + CreateIndexRequest createIndexRequest = new CreateIndexRequest(NoteConstant.RECORD_INDEX); + restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT); log.info("All search records have been cleared."); } else { log.warn("Index does not exist. No records to clear."); @@ -216,4 +245,4 @@ public class WebEsRecordServiceImpl implements IWebEsRecordService { e.printStackTrace(); } } -} +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index efa68e0..f994a69 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ 0.9.1 1.18.24 5.7.22 - 8.13.4 + 7.12.1 20.0 2.9.0 3.5.2 @@ -153,26 +153,11 @@ ${hutool.version} - - co.elastic.clients - elasticsearch-java - ${elasticsearch.version} - org.elasticsearch.client - elasticsearch-rest-client + elasticsearch-rest-high-level-client ${elasticsearch.version} - - jakarta.json - jakarta.json-api - 2.0.1 - - - org.eclipse.parsson - parsson - 1.0.5 -