fix
This commit is contained in:
parent
9360afa83b
commit
9ec83eec49
@ -66,7 +66,9 @@ public class FileElasticsearchGateway {
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建支持中文分词的多字段搜索查询(filename + content)
|
||||
* 构建支持中文和英文关键词的多字段搜索查询(filename + content)
|
||||
* - 中文:使用 match_phrase(避免单字拆分)
|
||||
* - 英文:附加 wildcard fallback(提升精度)
|
||||
*/
|
||||
private QueryBuilder buildSearchQuery(List<List<String>> 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 批量删除文档
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user