malei05 1 tháng trước cách đây
mục cha
commit
b1235b77c0

+ 15 - 7
fn-opensearch/src/main/java/net/yaoyi/pipeline/opensearch/OpenSearchHandler.java

@@ -44,12 +44,12 @@ public class OpenSearchHandler implements PojoRequestHandler<TaskImageMsg, List<
             }
 
             // 维度一:namespace 维度
-            String nsFilter = String.format("sourceSendPackageDeptId = %d and taskId != %d", taskImageIndex.getSourceSendPackageDeptId(), taskImageIndex.getTaskId());
+            String nsFilter = String.format("sourceSendPackageDeptId = %d AND taskId != %d", taskImageIndex.getSourceSendPackageDeptId(), taskImageIndex.getTaskId());
             List<TaskImageIndex.MultiResult> nsResult = knnSearch(namespace, taskImageIndex.getVector(), nsFilter, "namespace");
             List<TaskImageIndex.MultiResult> multiResultList = new ArrayList<>(nsResult);
 
             // 维度二:namespace + taskId 维度
-            String nsTaskFilter = String.format("sourceSendPackageDeptId = %d and taskId = %d and id != '%s'", taskImageIndex.getSourceSendPackageDeptId(), taskImageIndex.getTaskId(), taskImageIndex.getId());
+            String nsTaskFilter = String.format("sourceSendPackageDeptId = %d AND taskId = %d AND id != \"%s\"", taskImageIndex.getSourceSendPackageDeptId(), taskImageIndex.getTaskId(), taskImageIndex.getId());
             List<TaskImageIndex.MultiResult> nsTaskResult = knnSearch(namespace, taskImageIndex.getVector(), nsTaskFilter, "task");
             multiResultList.addAll(nsTaskResult);
             taskImageIndex.setMultiResult(JacksonUtils.toJson(multiResultList));
@@ -208,23 +208,29 @@ public class OpenSearchHandler implements PojoRequestHandler<TaskImageMsg, List<
             knn.setTopK(TOP_K);
             knn.setFilter(filter);
             knn.setScoreThreshold(SCORE_THRESHOLD);
-            knn.setOutputFields(List.of("id", "namespace", "fields"));
 
             SearchRequest request = new SearchRequest();
             request.setTableName(TABLE_NAME);
             request.setKnn(knn);
+            request.setOutputFields(List.of("taskId", "image"));
 
             SearchResponse response = OpenSearchUtils.getClient().search(request);
-            return parseToMultiResultList(response.getBody(), type);
+            String responseBody = response.getBody();
+            log.info("knn search filter:{}, namespace:{}, response:{}", filter, namespace, responseBody);
+
+            JsonNode bodyNode = JacksonUtils.toJsonNode(responseBody);
+            if (bodyNode.has("errorCode")) {
+                log.error("knn search fail. filter:{}, namespace:{}, response:{}", filter, namespace, responseBody);
+                throw new RuntimeException("knn search failed");
+            }
+            return parseToMultiResultList(bodyNode, type);
         } catch (Exception e) {
             log.error("knnSearch exception, filter:{}", filter, e);
             throw new RuntimeException("对比异常,filter:" + filter, e);
         }
     }
 
-    private List<TaskImageIndex.MultiResult> parseToMultiResultList(String body, String type) {
-        JsonNode bodyNode = JacksonUtils.toJsonNode(body);
-
+    private List<TaskImageIndex.MultiResult> parseToMultiResultList(JsonNode bodyNode, String type) {
         JsonNode resultArray;
         if (bodyNode == null || !bodyNode.has("result")
                 || !(resultArray = bodyNode.get("result")).isArray() || resultArray.isEmpty()) {
@@ -235,6 +241,7 @@ public class OpenSearchHandler implements PojoRequestHandler<TaskImageMsg, List<
         for (JsonNode jsonNode : resultArray) {
             TaskImageIndex.MultiResult multiResult = new TaskImageIndex.MultiResult();
             JsonNode fields = jsonNode.get("fields");
+
             multiResult.setTaskId(fields.get("taskId").asLong());
             multiResult.setImage(fields.get("image").asText());
 
@@ -244,6 +251,7 @@ public class OpenSearchHandler implements PojoRequestHandler<TaskImageMsg, List<
                 multiResult.setScore(jsonNode.get("similarityScore").asDouble());
             }
             multiResult.setType(type);
+            list.add(multiResult);
         }
         return list;
     }