cc 2 hete
szülő
commit
a4e5938d38

+ 1 - 1
ai-server/CODE_WIKI.md

@@ -381,7 +381,7 @@ RocksDBHelper (全局单例)
 
 - **实体**:`SearchDoc`(`@Document(indexName = "zsjz_search")`)——所有案件共用单索引,
   以 `caseId` 关键字字段隔离(写入端强制从 `CaseContextHolder` 注入,查询/删除必带过滤);
-  `_id = caseId|tableName|id`,同表同记录重复清洗幂等覆盖
+  `_id = caseId|tableName|rowId`(行主键字段不能命名为 id,见 SearchDoc 注释),同表同记录重复清洗幂等覆盖
 - **分词**:`es/search-settings.json` 定义 `unit_separator` 分词器(按 `\x1F` 切段 + 小写),
   对应各实体 `str()` 的全字段拼接约定;检索为对分词后 token 的 wildcard 子串匹配
 - **写入**:`SearchDocIndexService.add(SearchDoc)` 按 caseId 攒批 1000 条经 `saveAll` 走 `_bulk`;

+ 5 - 3
ai-server/src/main/java/com/zsjz/ai/module/search/domain/SearchDoc.java

@@ -42,10 +42,12 @@ public class SearchDoc {
     private String caseId;
 
     /**
-     * 业务行主键(原 Lucene 存储字段)
+     * 业务行主键(原 Lucene 存储字段)。注意:不能命名为 {@code id}——
+     * spring-data 会把名为 id 的字段识别为 id 属性候选,与 {@link #docId} 的
+     * {@code @Id} 冲突,启动即抛 MappingException
      */
     @Field(type = FieldType.Keyword)
-    private String id;
+    private String rowId;
 
     @Field(type = FieldType.Keyword)
     private String sheetId;
@@ -82,7 +84,7 @@ public class SearchDoc {
      */
     public SearchDoc(String id, String sheetId, String fileId, LocalDateTime dateTime,
                      String content, String tableName, String fileName, String sheetName) {
-        this.id = id;
+        this.rowId = id;
         this.sheetId = sheetId;
         this.fileId = fileId;
         this.dateTime = dateTime;

+ 1 - 1
ai-server/src/main/java/com/zsjz/ai/module/search/service/SearchDocIndexService.java

@@ -79,7 +79,7 @@ public class SearchDocIndexService {
     public void add(SearchDoc doc) {
         Long caseId = requireCaseId();
         doc.setCaseId(String.valueOf(caseId));
-        doc.setDocId(String.valueOf(caseId) + '|' + doc.getTableName() + '|' + doc.getId());
+        doc.setDocId(String.valueOf(caseId) + '|' + doc.getTableName() + '|' + doc.getRowId());
         List<SearchDoc> buffer = buffers.computeIfAbsent(caseId, key -> new java.util.ArrayList<>(BATCH_SIZE));
         List<SearchDoc> batch = null;
         synchronized (buffer) {

+ 1 - 1
ai-server/src/main/java/com/zsjz/ai/module/search/service/SearchQueryService.java

@@ -92,7 +92,7 @@ public class SearchQueryService {
     private SearchDTO convert(SearchHit<SearchDoc> hit) {
         SearchDoc doc = hit.getContent();
         SearchDTO dto = new SearchDTO();
-        dto.setId(doc.getId());
+        dto.setId(doc.getRowId());
         dto.setSheetId(doc.getSheetId());
         dto.setFileId(doc.getFileId());
         dto.setTableName(doc.getTableName());

+ 8 - 0
ai-server/src/main/resources/application-dev.yaml

@@ -21,6 +21,14 @@ spring:
       host: 192.168.0.109
       port: 6379
 
+  elasticsearch:
+    # 全文检索(替代原嵌入式 Lucene)。本机单节点默认地址,独立服务器时改 uris 即可
+    uris: https://192.168.0.109:9200
+    connection-timeout: 5s
+    socket-timeout: 60s
+    username: elastic
+    password: a*qayNZRcIpE2S4sRac=
+
 
 storage:
   local:

+ 0 - 5
ai-server/src/main/resources/application.yaml

@@ -20,11 +20,6 @@ spring:
     multipart:
       max-file-size: 200MB
       max-request-size: 500MB
-  elasticsearch:
-    # 全文检索(替代原嵌入式 Lucene)。本机单节点默认地址,独立服务器时改 uris 即可
-    uris: http://127.0.0.1:9200
-    connection-timeout: 5s
-    socket-timeout: 60s
 
 # AI 研判(对象关系分析)配置 —— 见 continuous-insight-plan.md §4.1.7
 zsjz: