Forráskód Böngészése

Merge remote-tracking branch 'origin/yxp' into text

lzy 2 hete
szülő
commit
ddf69a40dd

+ 2 - 4
pom.xml

@@ -51,7 +51,6 @@
             <version>0.11.5</version>
             <scope>runtime</scope>
         </dependency>
-
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
@@ -60,6 +59,7 @@
         <dependency>
             <groupId>javax.validation</groupId>
             <artifactId>validation-api</artifactId>
+            <version>2.0.1.Final</version> <!-- 指定版本 -->
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
@@ -94,7 +94,6 @@
             <artifactId>hutool-all</artifactId>
             <version>5.8.16</version>
         </dependency>
-
         <dependency>
             <groupId>com.mysql</groupId>
             <artifactId>mysql-connector-j</artifactId>
@@ -105,7 +104,6 @@
             <artifactId>lombok</artifactId>
             <optional>true</optional>
         </dependency>
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
@@ -156,7 +154,7 @@
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
+            <artifactId>spring-boot-starter-data-mongodb</artifactId>
         </dependency>
     </dependencies>
     <dependencyManagement>

+ 8 - 0
src/main/java/com/futu/course/es/Service/ESService.java

@@ -0,0 +1,8 @@
+package com.futu.course.es.Service;
+
+import com.futu.course.es.domain.ESCourse;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+public interface ESService extends MongoRepository<ESCourse,String> {
+
+}

+ 119 - 9
src/main/java/com/futu/course/es/Service/ESCourseService.java → src/main/java/com/futu/course/es/Service/impl/ESCourseService.java

@@ -1,17 +1,24 @@
-package com.futu.course.es.Service;
+package com.futu.course.es.Service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.futu.course.course.domain.Course;
 import com.futu.course.course.service.impl.CourseServiceImpl;
+import com.futu.course.es.Service.ESService;
 import com.futu.course.es.domain.ESCourse;
+import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
+import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
 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.SearchResponse;
 import org.elasticsearch.action.support.WriteRequest;
+import org.elasticsearch.client.IndicesClient;
 import org.elasticsearch.client.RequestOptions;
 import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.client.indices.CreateIndexRequest;
+import org.elasticsearch.client.indices.CreateIndexResponse;
+import org.elasticsearch.client.indices.GetIndexRequest;
 import org.elasticsearch.common.bytes.BytesReference;
 import org.elasticsearch.index.query.BoolQueryBuilder;
 import org.elasticsearch.index.query.MatchAllQueryBuilder;
@@ -19,6 +26,8 @@ import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.index.reindex.DeleteByQueryRequest;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.elasticsearch.xcontent.XContentBuilder;
+import org.elasticsearch.xcontent.XContentFactory;
 import org.elasticsearch.xcontent.XContentType;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -39,6 +48,8 @@ public class ESCourseService {
     RestHighLevelClient client;
     @Autowired
     CourseServiceImpl courseService;
+    @Autowired
+    ESService esService;
 
     /**
      * @title: search
@@ -86,6 +97,8 @@ public class ESCourseService {
      */
     @Transactional
     public void MysqlInterES() throws IOException {
+//        创建索引
+        this.checkAndCreateIndex();
         // ES删除所有数据
         DeleteByQueryRequest request = new DeleteByQueryRequest("course");
         // 使用 MatchAllQuery 匹配所有文档
@@ -97,7 +110,7 @@ public class ESCourseService {
         // 初始化数据
         for (Course course : list) {
             ESCourse esCourse = new ESCourse();
-            esCourse.setId(course.getId());
+            esCourse.setId(String.valueOf(course.getId()));
             esCourse.setName(course.getTitle());
             esCourse.setCategoryId(Long.valueOf(course.getCategoryId()));
             esCourse.setCoverImg(course.getCoverImg());
@@ -148,9 +161,9 @@ public class ESCourseService {
                     // 处理可能的类型转换问题
                     Object idObj = sourceAsMap.get("id");
                     if (idObj instanceof Integer) {
-                        esCourse.setId(((Integer) idObj).longValue());
+                        esCourse.setId(String.valueOf(((Integer) idObj).longValue()));
                     } else if (idObj instanceof Long) {
-                        esCourse.setId((Long) idObj);
+                        esCourse.setId(String.valueOf((Long) idObj));
                     }
 
                     esCourse.setName((String) sourceAsMap.get("name"));
@@ -191,9 +204,9 @@ public class ESCourseService {
                 // 处理可能的类型转换问题
                 Object idObj = sourceAsMap.get("id");
                 if (idObj instanceof Integer) {
-                    esCourse.setId(((Integer) idObj).longValue());
+                    esCourse.setId(String.valueOf(((Integer) idObj).longValue()));
                 } else if (idObj instanceof Long) {
-                    esCourse.setId((Long) idObj);
+                    esCourse.setId(String.valueOf((Long) idObj));
                 }
 
                 esCourse.setName((String) sourceAsMap.get("name"));
@@ -217,7 +230,14 @@ public class ESCourseService {
         }
         return esCourses;
     }
-
+    /**
+     * @title: SelCourse
+     * @desc:  搜索并将搜索记录写入到MongoDB中
+     * @params ()
+     * @return: Result
+     * @author: 杨旭朋
+     * @date: 2025/5/8 8:35
+     */
     public HashSet<ESCourse> SelCourse(String name) throws IOException {
         // 创建搜索请求
         SearchRequest searchRequest = new SearchRequest("course");
@@ -244,9 +264,9 @@ public class ESCourseService {
             // 处理可能的类型转换问题
             Object idObj = sourceAsMap.get("id");
             if (idObj instanceof Integer) {
-                esCourse.setId(((Integer) idObj).longValue());
+                esCourse.setId(String.valueOf(((Integer) idObj).longValue()));
             } else if (idObj instanceof Long) {
-                esCourse.setId((Long) idObj);
+                esCourse.setId(String.valueOf((Long) idObj));
             }
 
             esCourse.setName((String) sourceAsMap.get("name"));
@@ -266,7 +286,97 @@ public class ESCourseService {
             esCourse.setCoverImg((String) sourceAsMap.get("cover_img"));
             esCourses.add(esCourse);
         }
+        this.SaveMongoDB(name);
         return esCourses;
     }
+    /**
+     * @title: SaveMongoDB
+     * @desc:  保存聊天记录到MongoDB中
+     * @params String name
+     * @return: void
+     * @author: 杨旭朋
+     * @date: 2025/5/8 9:14
+     */
+    public void SaveMongoDB(String name){
+        List<ESCourse> all = esService.findAll();
+        int i = 0;
+        for (ESCourse esCourse : all) {
+            if (esCourse.getName().equals(name)){
+                ESCourse byId = esService.findById(esCourse.getId().toString()).get();
+                byId.setCreateTime(new Date());
+                esService.save(byId);
+                i++;
+            }
+        }
+        if (i == 0){
+            ESCourse esCourse = new ESCourse();
+            String string = UUID.randomUUID().toString();
+            esCourse.setId(string);
+            esCourse.setName(name);
+            esCourse.setCreateTime(new Date());
+            esCourse.setUid(1L);
+            esService.save(esCourse);
+        }
+    }
+    /**
+     * @title: checkAndCreateIndex
+     * @desc:  数据初始化
+     * @params ()
+     * @return: Result
+     * @author: 杨旭朋
+     * @date: 2025/5/8 15:25
+     */
+    public boolean checkAndCreateIndex() throws IOException {
+        IndicesClient indicesClient = client.indices();
+        // 检查索引是否存在
+        GetIndexRequest getIndexRequest = new GetIndexRequest("course");
+        boolean exists = indicesClient.exists(getIndexRequest, RequestOptions.DEFAULT);
+
+        if (!exists) {
+            // 索引不存在,创建索引
+            CreateIndexRequest createRequest = new CreateIndexRequest("course");
+            // 设置索引映射
+            XContentBuilder mappingBuilder = XContentFactory.jsonBuilder();
+            mappingBuilder.startObject()
+                    .startObject("properties")
+                    .startObject("id")
+                    .field("type", "long")
+                    .endObject()
+                    .startObject("name")
+                    .field("type", "text")
+                    .field("analyzer", "ik_max_word")
+                    .endObject()
+                    .startObject("uid")
+                    .field("type", "long")
+                    .endObject()
+                    .startObject("create_time")
+                    .field("type", "date")
+                    .field("format", "yyyy-MM-dd HH:mm:ss")
+                    .endObject()
+                    .startObject("price")
+                    .field("type", "float")
+                    .endObject()
+                    .startObject("category_id")
+                    .field("type", "long")
+                    .endObject()
+                    .startObject("cover_img")
+                    .field("type", "keyword")
+                    .endObject()
+                    .endObject()
+                    .endObject();
+            createRequest.mapping(mappingBuilder);
+
+            CreateIndexResponse createResponse = indicesClient.create(createRequest, RequestOptions.DEFAULT);
+            if (createResponse.isAcknowledged()) {
+                System.out.println("索引course创建成功");
+                return true;
+            } else {
+                System.out.println("索引course创建失败");
+                return false;
+            }
+        }
+        System.out.println("索引course已存在");
+        return true;
+    }
 
 }

+ 5 - 2
src/main/java/com/futu/course/es/controller/ESCourseController.java

@@ -1,8 +1,7 @@
 package com.futu.course.es.controller;
 
-import com.futu.course.es.Service.ESCourseService;
+import com.futu.course.es.Service.impl.ESCourseService;
 import com.futu.course.es.domain.ESCourse;
-import org.elasticsearch.search.SearchHit;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -36,4 +35,8 @@ public class ESCourseController {
     public HashSet<ESCourse> SelCourse(@RequestParam("name") String name) throws IOException {
         return esCourseService.SelCourse(name);
     }
+    @GetMapping("checkAndCreateIndex")
+    public boolean checkAndCreateIndex() throws IOException {
+        return esCourseService.checkAndCreateIndex();
+    }
 }

+ 4 - 3
src/main/java/com/futu/course/es/domain/ESCourse.java

@@ -2,26 +2,27 @@ package com.futu.course.es.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 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 lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.mapping.Document;
 
 import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
 // 对 ES 中的 course 进行映射
-@Document(indexName = "course")
+@Document("course")
 @NoArgsConstructor
 @AllArgsConstructor
 public class ESCourse {
     // 用于 Elasticsearch 的主键注解
     @Id
     @Field(type = FieldType.Long)
-    private Long id;
+    private String id;
 
     @Field(name = "name", type = FieldType.Text, analyzer = "ik_max_word")
     private String name;

+ 4 - 0
src/main/resources/application.yml

@@ -1,6 +1,10 @@
 server:
   port: 8003
 spring:
+  data:
+    mongodb:
+      # 在数据库名后添加参数,这里以添加最大连接池大小和最小连接池大小为例
+      uri: mongodb://localhost:27017/course?maxPoolSize=100&minPoolSize=10
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     url: jdbc:mysql://182.92.251.243:3306/goose?characterEncoding=utf8&serverTimezone=GMT%2B8

+ 6 - 0
接口文档.txt

@@ -0,0 +1,6 @@
+      方法               参数              返回                 作用           请求         请求路径
+   search             String name    ArrayList<String>       搜索指引         post     /EsCourse/search
+   MysqlInterES          无                无              同步mysql中的数据   get      /EsCourse/MysqlInterES
+   CourseList         int categoryId  HashSet<ESCourse>    课程分类查询所有    Post     /EsCourse/CourseList
+   SelCourse          String name     HashSet<ESCourse>     课程的搜索        Post     /EsCourse/SelCourse
+   checkAndCreateIndex  无              boolean           ES索引结构初始化     Get      /EsCourse/checkAndCreateIndex