Rescore(重评分)是 Elasticsearch 提供的一种查询优化机制,它允许对原始查询返回的顶部文档进行二次评分。这种机制特别适用于以下场景:
Elasticsearch 支持两种 rescore 类型:
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.rescore.QueryRescorerBuilder;
// 构建原始查询
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("title", "spring data"));
// 构建rescore
QueryRescorerBuilder rescorer = new QueryRescorerBuilder(
QueryBuilders.functionScoreQuery(
QueryBuilders.matchAllQuery(),
ScoreFunctionBuilders.fieldValueFactorFunction("popularity")
)
).setQueryWeight(0.7f).setRescoreQueryWeight(0.3f).windowSize(50);
// 添加rescore到查询
queryBuilder.withRescorer(rescorer);
// 执行查询
SearchHits<YourEntity> hits = elasticsearchOperations.search(
queryBuilder.build(),
YourEntity.class
);
// 构建主查询 - 匹配标题或内容
QueryBuilder mainQuery = QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("title", "elasticsearch"))
.should(QueryBuilders.matchQuery("content", "elasticsearch"));
// 构建rescore查询 - 考虑发布时间和点赞数
QueryBuilder rescoreQuery = QueryBuilders.functionScoreQuery()
.add(ScoreFunctionBuilders.gaussDecayFunction(
"publishTime",
new DateTime().toString(),
"7d",
null,
0.5
))
.add(ScoreFunctionBuilders.fieldValueFactorFunction("likes").factor(0.1f));
// 构建完整查询
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(mainQuery)
.withRescorer(new QueryRescorerBuilder(rescoreQuery)
.setQueryWeight(0.6f)
.setRescoreQueryWeight(0.4f)
.windowSize(100))
.build();
原因:
解决方案:
原因:
解决方案:
原因:
解决方案:
通过合理使用 rescore 功能,可以在不显著增加查询成本的情况下,显著提升搜索结果的排序质量。
没有搜到相关的文章