我对lucene得分策略感到有些困惑。我知道Lucene的评分公式如下:
score(q,d) = coord(q,d) x queryNorm(q) X SUM <t_in_q> ( tf(t_in_d) x idf(t)^2 x t.getBoost() x norm(t,d))
我了解此公式中的每个组件,但 queryNorm(q)除外。正如官方文档所解释的那样,
queryNorm(q)是用于在两者之间进行分数的归一化因子 查询可比较。此因素不会影响文档排名 (因为所有排名的文档都乘以相同的因子),但是 而只是尝试从不同的查询(或甚至 不同的指数)可比较。
为什么我需要比较不同查询之间的分数?换句话说,您是否可以使用示例来显示哪个上下文 queryNorm(q)有用?
答案 0 :(得分:5)
好问题,我自己也想知道这件事。根据{{3}},尝试在不同时间比较不同的查询或索引分数,甚至是同一查询和索引的分数,这是一个坏主意,我同意。
我的理解是,虽然queryNorm
确实不能使它们具有严格的可比性,但它确实有帮助。它们与Default queryNorm相比更接近于没有。
我想它也可以让人们写出自己的相似性,并使用这个调用来创建规范化的,可比较的分数,使用适合他们特定情况的算法。
有一些this ScoresAsPercentages argument,您可能会感兴趣。
答案 1 :(得分:0)
我知道这个问题已经过时了,但我遇到了类似的问题。 queryNorm在所有搜索结果中不一样的原因是文档可以在不同的分片中,并且queryNorm仅在同一分片中是常量。
根据我的理解,这个问题可以通过两种方式解决:
当然,当有大量数据时
将分片数量设置为1.这对性能有影响。
{ “settings”:{“number_of_shards”:1} }
请参阅http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/relevance-is-broken.html