From 566ed1d880c921e0de263ccdcfc9da9810a90482 Mon Sep 17 00:00:00 2001 From: "Luke.Ye" Date: Tue, 8 Jul 2025 15:03:34 +0800 Subject: [PATCH] opt --- .../south/es/FileElasticsearchGateway.java | 48 ++++++++++++++----- 1 file changed, 37 insertions(+), 11 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 fd44eb5..ef3de00 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 @@ -57,20 +57,14 @@ public class FileElasticsearchGateway { if (CollectionUtil.isEmpty(keywords)) { return Lists.newArrayList(); } + List> keywordGroups = keywords.stream() + .map(Collections::singletonList) + .collect(Collectors.toList()); - BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); - for (String kw : keywords) { - boolQuery.must(QueryBuilders.multiMatchQuery(kw) - .field("filename", 10.0f) - .field("content", 1.0f) - .type(org.elasticsearch.index.query.MultiMatchQueryBuilder.Type.BEST_FIELDS)); - } - boolQuery.filter(QueryBuilders.rangeQuery(FileEsField.EXPIRE_TIME) - .gte(System.currentTimeMillis()) - .timeZone("+08:00")); + QueryBuilder query = buildAllMustSearchQuery(keywordGroups); SearchSourceBuilder builder = new SearchSourceBuilder() - .query(boolQuery) + .query(query) .from(0) .size(6) .sort("_score", SortOrder.DESC); @@ -92,6 +86,38 @@ public class FileElasticsearchGateway { return result; } + private QueryBuilder buildAllMustSearchQuery(List> keywordGroups) { + BoolQueryBuilder outerQuery = QueryBuilders.boolQuery(); + for (List group : keywordGroups) { + BoolQueryBuilder groupQuery = QueryBuilders.boolQuery(); + + for (String keyword : group) { + BoolQueryBuilder fieldQuery = QueryBuilders.boolQuery(); + + // 标题(filename)权重高 + fieldQuery.should(QueryBuilders.matchPhraseQuery(FileEsField.FILENAME, keyword).boost(10.0f)); + fieldQuery.should(QueryBuilders.matchPhraseQuery(FileEsField.CONTENT, keyword).boost(1.0f)); + + // 英文关键词额外加wildcard匹配,filename.keyword也加权 + if (isEnglishLike(keyword)) { + fieldQuery.should(QueryBuilders.wildcardQuery("filename.keyword", "*" + keyword + "*").boost(10.0f)); + } + + groupQuery.must(fieldQuery); + } + // 必须命中所有关键词分组 + outerQuery.must(groupQuery); + } + + // 过滤过期文档 + outerQuery.filter(QueryBuilders.rangeQuery(FileEsField.EXPIRE_TIME) + .gte(System.currentTimeMillis()) + .timeZone("+08:00")); + + return outerQuery; + } + + public SearchResponse searchFileDocuments(List> keywordGroups, int page, int size) { try {