From 9ec83eec491f1a963e5b95ceec49b1b18fa3b5a9 Mon Sep 17 00:00:00 2001 From: luke Date: Sat, 21 Jun 2025 08:11:03 +0800 Subject: [PATCH] fix --- .../south/es/FileElasticsearchGateway.java | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/knowledge/base/infrastructure/south/es/FileElasticsearchGateway.java b/src/main/java/com/knowledge/base/infrastructure/south/es/FileElasticsearchGateway.java index e099c16..30f1a4d 100644 --- a/src/main/java/com/knowledge/base/infrastructure/south/es/FileElasticsearchGateway.java +++ b/src/main/java/com/knowledge/base/infrastructure/south/es/FileElasticsearchGateway.java @@ -66,7 +66,9 @@ public class FileElasticsearchGateway { } /** - * 构建支持中文分词的多字段搜索查询(filename + content) + * 构建支持中文和英文关键词的多字段搜索查询(filename + content) + * - 中文:使用 match_phrase(避免单字拆分) + * - 英文:附加 wildcard fallback(提升精度) */ private QueryBuilder buildSearchQuery(List> keywordGroups) { BoolQueryBuilder outerQuery = QueryBuilders.boolQuery(); @@ -75,18 +77,28 @@ public class FileElasticsearchGateway { BoolQueryBuilder groupQuery = QueryBuilders.boolQuery(); for (String keyword : group) { - groupQuery.must(QueryBuilders.boolQuery() - .should(QueryBuilders.matchQuery(FileEsField.FILENAME, keyword).analyzer("ik_smart")) - .should(QueryBuilders.matchQuery(FileEsField.CONTENT, keyword).analyzer("ik_smart")) - ); + BoolQueryBuilder fieldQuery = QueryBuilders.boolQuery(); + + // 中文或长词使用 match_phrase + fieldQuery.should(QueryBuilders.matchPhraseQuery(FileEsField.FILENAME, keyword)); + fieldQuery.should(QueryBuilders.matchPhraseQuery(FileEsField.CONTENT, keyword)); + + // 英文或短词添加 keyword fallback(如 ESB、API 等) + if (isEnglishLike(keyword)) { + fieldQuery.should(QueryBuilders.wildcardQuery("filename.keyword", "*" + keyword + "*")); + } + + // 每个关键词都要求命中(must) + groupQuery.must(fieldQuery); } + // 不同关键词组之间是 or 关系(should) outerQuery.should(groupQuery); } outerQuery.minimumShouldMatch(1); - // 过滤掉过期文件 + // 过滤过期文档 outerQuery.filter(QueryBuilders.rangeQuery(FileEsField.EXPIRE_TIME) .gte(System.currentTimeMillis()) .timeZone("+08:00")); @@ -94,6 +106,14 @@ public class FileElasticsearchGateway { return outerQuery; } + /** + * 判断关键词是否为英文或混合英文字符(用于决定是否加 fallback 查询) + */ + private boolean isEnglishLike(String keyword) { + if (keyword == null) return false; + return keyword.length() <= 20 && keyword.matches(".*[A-Za-z0-9]+.*"); + } + /** * 根据 filepath 批量删除文档