在对字段应用提升值时,我的分数在 Elasticsearch 中保持不变,有时分数甚至会降低。有人可以提出建议吗?
MoreLikeThisQueryBuilder mltQuery2 = QueryBuilders.moreLikeThisQuery("field1","field2")
.ids(docId)
.minTermFreq(1)
.maxQueryTerms(12);
SearchResponse searchResponse = client.prepareSearch(index).setTypes(indexType).setQuery(QueryBuilders.bolQuery()
.should(mltQuery2.boost(50))
boost(50) 不会增加分数。
最佳答案
在那里应用提升并没有真正完成任何事情。提升用于增强子查询在整个查询中的影响。所以它会是这样的:
QueryBuilders.boolQuery
.should(mltQuery.boost(50))
.should(someOtherQueryBuilder);
在那里,相对于其他子查询,您的 mlt 查询将提升至正常分数的 50 倍。
更改 boost 甚至可能导致分数降低的具体原因是 queryNorm 评分因素。总分乘以:
1 / ( q.getBoost()2 · ∑ ( idf(t) · t.getBoost() )2 )1/2
这样做的目的是使结果集的总体得分具有非常粗略的可比性。了解更多请查看Lucene's documentation of the scoring algorithm ,和Elasticsearch provides an explanation as well.
要记住的是,分数实际上只在特定查询的上下文中有用。尝试保存分数和/或将它们与其他查询的结果进行比较并不是一个好主意(即使有 queryNorm)。我的印象是你正试图标准化分数。请看这个问题:
关于java - ElasticSearch - 提高特定领域的分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31580260/