|
@@ -1,20 +1,32 @@
|
|
package com.futu.course.es.Service;
|
|
package com.futu.course.es.Service;
|
|
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
|
+import com.futu.course.course.domain.Course;
|
|
import com.futu.course.course.service.impl.CourseServiceImpl;
|
|
import com.futu.course.course.service.impl.CourseServiceImpl;
|
|
|
|
+import com.futu.course.es.domain.ESCourse;
|
|
|
|
+import org.elasticsearch.action.bulk.BulkRequest;
|
|
|
|
+import org.elasticsearch.action.delete.DeleteRequest;
|
|
|
|
+import org.elasticsearch.action.index.IndexRequest;
|
|
import org.elasticsearch.action.search.SearchRequest;
|
|
import org.elasticsearch.action.search.SearchRequest;
|
|
import org.elasticsearch.action.search.SearchResponse;
|
|
import org.elasticsearch.action.search.SearchResponse;
|
|
|
|
+import org.elasticsearch.action.support.WriteRequest;
|
|
import org.elasticsearch.client.RequestOptions;
|
|
import org.elasticsearch.client.RequestOptions;
|
|
import org.elasticsearch.client.RestHighLevelClient;
|
|
import org.elasticsearch.client.RestHighLevelClient;
|
|
|
|
+import org.elasticsearch.common.bytes.BytesReference;
|
|
import org.elasticsearch.index.query.BoolQueryBuilder;
|
|
import org.elasticsearch.index.query.BoolQueryBuilder;
|
|
|
|
+import org.elasticsearch.index.query.MatchAllQueryBuilder;
|
|
import org.elasticsearch.index.query.QueryBuilders;
|
|
import org.elasticsearch.index.query.QueryBuilders;
|
|
|
|
+import org.elasticsearch.index.reindex.DeleteByQueryRequest;
|
|
import org.elasticsearch.search.SearchHit;
|
|
import org.elasticsearch.search.SearchHit;
|
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
|
|
|
+import org.elasticsearch.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 java.io.IOException;
|
|
import java.io.IOException;
|
|
-import java.util.ArrayList;
|
|
|
|
-import java.util.Map;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
/**
|
|
* @author "杨旭朋"
|
|
* @author "杨旭朋"
|
|
@@ -27,10 +39,11 @@ public class ESCourseService {
|
|
RestHighLevelClient client;
|
|
RestHighLevelClient client;
|
|
@Autowired
|
|
@Autowired
|
|
CourseServiceImpl courseService;
|
|
CourseServiceImpl courseService;
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* @title: search
|
|
* @title: search
|
|
- * @desc: ES搜索指引
|
|
|
|
- * @params ( String name)
|
|
|
|
|
|
+ * @desc: ES搜索指引
|
|
|
|
+ * @params (String name)
|
|
* @return: ArrayList<String>
|
|
* @return: ArrayList<String>
|
|
* @author: 杨旭朋
|
|
* @author: 杨旭朋
|
|
* @date: 2025/5/6 16:29
|
|
* @date: 2025/5/6 16:29
|
|
@@ -45,7 +58,7 @@ public class ESCourseService {
|
|
// 创建条件,在条件中添加 match 查询,使用 ik 分词器
|
|
// 创建条件,在条件中添加 match 查询,使用 ik 分词器
|
|
.must(QueryBuilders.matchQuery("name", name));
|
|
.must(QueryBuilders.matchQuery("name", name));
|
|
// 设置查询的最大条数
|
|
// 设置查询的最大条数
|
|
- searchSourceBuilder.size(10);
|
|
|
|
|
|
+ searchSourceBuilder.size(5);
|
|
// 将搜索容器添加搜索条件
|
|
// 将搜索容器添加搜索条件
|
|
searchSourceBuilder.query(boolQueryBuilder);
|
|
searchSourceBuilder.query(boolQueryBuilder);
|
|
// 添加数据为搜索容器
|
|
// 添加数据为搜索容器
|
|
@@ -62,15 +75,146 @@ public class ESCourseService {
|
|
}
|
|
}
|
|
return list;
|
|
return list;
|
|
}
|
|
}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* @title: MysqlInterES
|
|
* @title: MysqlInterES
|
|
- * @desc: 将mysql中的数据与mysql进行同步
|
|
|
|
|
|
+ * @desc: 将mysql中的数据与ES进行同步
|
|
* @params ()
|
|
* @params ()
|
|
* @return: Result
|
|
* @return: Result
|
|
* @author: 杨旭朋
|
|
* @author: 杨旭朋
|
|
* @date: 2025/5/6 16:50
|
|
* @date: 2025/5/6 16:50
|
|
*/
|
|
*/
|
|
- public void MysqlInterES(){
|
|
|
|
|
|
+ @Transactional
|
|
|
|
+ public void MysqlInterES() throws IOException {
|
|
|
|
+ // ES删除所有数据
|
|
|
|
+ DeleteByQueryRequest request = new DeleteByQueryRequest("course");
|
|
|
|
+ // 使用 MatchAllQuery 匹配所有文档
|
|
|
|
+ request.setQuery(QueryBuilders.matchAllQuery());
|
|
|
|
+ client.deleteByQuery(request, RequestOptions.DEFAULT);
|
|
|
|
+ // 查询数据库中所有的课程
|
|
|
|
+ List<Course> list = courseService.list();
|
|
|
|
+ List<ESCourse> esCourses = new ArrayList<>();
|
|
|
|
+ // 初始化数据
|
|
|
|
+ for (Course course : list) {
|
|
|
|
+ ESCourse esCourse = new ESCourse();
|
|
|
|
+ esCourse.setId(course.getId());
|
|
|
|
+ esCourse.setName(course.getTitle());
|
|
|
|
+ esCourse.setCategoryId(Long.valueOf(course.getCategoryId()));
|
|
|
|
+ esCourse.setCoverImg(course.getCoverImg());
|
|
|
|
+ esCourse.setPrice(course.getPrice());
|
|
|
|
+ esCourses.add(esCourse);
|
|
|
|
+ }
|
|
|
|
+ // 将数据添加到ES中
|
|
|
|
+ BulkRequest bulkRequest = new BulkRequest("course");
|
|
|
|
+ for (ESCourse esCourse : esCourses) {
|
|
|
|
+ String string = JSON.toJSONString(esCourse);
|
|
|
|
+ IndexRequest indexRequest = new IndexRequest()
|
|
|
|
+ .id(esCourse.getId().toString())
|
|
|
|
+ .source(string, XContentType.JSON);
|
|
|
|
+ bulkRequest.add(indexRequest);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @title: CourseList
|
|
|
|
+ * @desc: 分类查询所有
|
|
|
|
+ * @params int categoryId
|
|
|
|
+ * @return: HashSet<ESCourse>
|
|
|
|
+ * @author: 杨旭朋
|
|
|
|
+ * @date: 2025/5/7 17:09
|
|
|
|
+ */
|
|
|
|
+ public HashSet<ESCourse> CourseList(int categoryId) throws IOException {
|
|
|
|
+ SearchRequest searchRequest = new SearchRequest("course");
|
|
|
|
+ // 创建搜索容器
|
|
|
|
+ SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
|
|
|
|
+ HashSet<ESCourse> esCourses = new HashSet<>();
|
|
|
|
+ if (categoryId != 0) {
|
|
|
|
+ BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
|
|
|
|
+ // 创建条件在条件中添加 term 查询
|
|
|
|
+ .must(QueryBuilders.termQuery("category_id", categoryId));
|
|
|
|
+ // 将搜索容器添加搜索条件
|
|
|
|
+ searchSourceBuilder.query(boolQueryBuilder);
|
|
|
|
+ // 添加数据为搜索容器
|
|
|
|
+ searchRequest.source(searchSourceBuilder);
|
|
|
|
+ try {
|
|
|
|
+ // 执行请求,并获取响应
|
|
|
|
+ SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
|
|
|
|
+ System.out.println(searchRequest);
|
|
|
|
+ SearchHit[] hits = search.getHits().getHits();
|
|
|
|
+ for (SearchHit hit : hits) {
|
|
|
|
+ ESCourse esCourse = new ESCourse();
|
|
|
|
+ Map<String, Object> sourceAsMap = hit.getSourceAsMap();
|
|
|
|
+
|
|
|
|
+ // 处理可能的类型转换问题
|
|
|
|
+ Object idObj = sourceAsMap.get("id");
|
|
|
|
+ if (idObj instanceof Integer) {
|
|
|
|
+ esCourse.setId(((Integer) idObj).longValue());
|
|
|
|
+ } else if (idObj instanceof Long) {
|
|
|
|
+ esCourse.setId((Long) idObj);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ esCourse.setName((String) sourceAsMap.get("name"));
|
|
|
|
+
|
|
|
|
+ Object priceObj = sourceAsMap.get("price");
|
|
|
|
+ if (priceObj instanceof Number) {
|
|
|
|
+ esCourse.setPrice(BigDecimal.valueOf(((Number) priceObj).doubleValue()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Object categoryIdObj = sourceAsMap.get("category_id");
|
|
|
|
+ if (categoryIdObj instanceof Integer) {
|
|
|
|
+ esCourse.setCategoryId(((Integer) categoryIdObj).longValue());
|
|
|
|
+ } else if (categoryIdObj instanceof Long) {
|
|
|
|
+ esCourse.setCategoryId((Long) categoryIdObj);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ esCourse.setCoverImg((String) sourceAsMap.get("cover_img"));
|
|
|
|
+ esCourses.add(esCourse);
|
|
|
|
+ }
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ System.err.println("执行搜索请求时出现异常: ");
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ // 创建 MatchAllQueryBuilder 并设置 boost 值
|
|
|
|
+ MatchAllQueryBuilder matchAllQuery = QueryBuilders.matchAllQuery();
|
|
|
|
+ matchAllQuery.boost(1.0f);
|
|
|
|
+ searchSourceBuilder.query(matchAllQuery);
|
|
|
|
+ // 将 SearchSourceBuilder 设置到 SearchRequest 中
|
|
|
|
+ searchRequest.source(searchSourceBuilder);
|
|
|
|
+ // 执行搜索请求
|
|
|
|
+ SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
|
|
|
|
+ SearchHit[] hits = searchResponse.getHits().getHits();
|
|
|
|
+ for (SearchHit hit : hits) {
|
|
|
|
+ ESCourse esCourse = new ESCourse();
|
|
|
|
+ Map<String, Object> sourceAsMap = hit.getSourceAsMap();
|
|
|
|
|
|
|
|
+ // 处理可能的类型转换问题
|
|
|
|
+ Object idObj = sourceAsMap.get("id");
|
|
|
|
+ if (idObj instanceof Integer) {
|
|
|
|
+ esCourse.setId(((Integer) idObj).longValue());
|
|
|
|
+ } else if (idObj instanceof Long) {
|
|
|
|
+ esCourse.setId((Long) idObj);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ esCourse.setName((String) sourceAsMap.get("name"));
|
|
|
|
+
|
|
|
|
+ Object priceObj = sourceAsMap.get("price");
|
|
|
|
+ if (priceObj instanceof Number) {
|
|
|
|
+ esCourse.setPrice(BigDecimal.valueOf(((Number) priceObj).doubleValue()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Object categoryIdObj = sourceAsMap.get("category_id");
|
|
|
|
+ if (categoryIdObj instanceof Integer) {
|
|
|
|
+ esCourse.setCategoryId(((Integer) categoryIdObj).longValue());
|
|
|
|
+ } else if (categoryIdObj instanceof Long) {
|
|
|
|
+ esCourse.setCategoryId((Long) categoryIdObj);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ esCourse.setCoverImg((String) sourceAsMap.get("cover_img"));
|
|
|
|
+ esCourses.add(esCourse);
|
|
|
|
+ }
|
|
|
|
+ // 处理搜索结果
|
|
|
|
+ }
|
|
|
|
+ return esCourses;
|
|
}
|
|
}
|
|
}
|
|
}
|