This commit is contained in:
Luke.Ye 2025-07-08 15:03:34 +08:00
parent 69a3a1bb49
commit 566ed1d880

View File

@ -57,20 +57,14 @@ public class FileElasticsearchGateway {
if (CollectionUtil.isEmpty(keywords)) {
return Lists.newArrayList();
}
List<List<String>> 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<List<String>> keywordGroups) {
BoolQueryBuilder outerQuery = QueryBuilders.boolQuery();
for (List<String> 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<List<String>> keywordGroups, int page, int size) {
try {