5

我对 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)在哪个上下文中有用吗?

4

2 回答 2

5

好问题,我自己也想过这个问题。根据这个 ScoresAsPercentages 参数,尝试比较不同查询或索引的分数,甚至在不同时间对同一查询和索引的分数,是一个坏主意,我同意。

我的理解是,虽然queryNorm确实不能让它们严格比较,但它确实有帮助。它们更接近于与 Default queryNorm 相比,而不是没有。

我想它还可以让人们编写自己的相似性,并使用这个调用来创建标准化的、可比较的分数,使用适用于他们特定情况的算法。

已经有一些关于放弃它的讨论,您可能会觉得这很有趣。

于 2013-05-28T16:15:10.330 回答
0

我知道这个问题很老,但我遇到了类似的问题。queryNorm 在所有搜索结果上不一样的原因是文档可以在不同的分片中,而 queryNorm 仅在同一个分片中是恒定的。

据我了解,这个问题可以通过两种方式解决:

  • 自然,当有大量数据时

  • 将分片数设置为 1。当然,这会对性能产生影响。

    {“设置”:{“number_of_shards”:1}}

请参阅http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/relevance-is-broken.html

于 2015-03-06T13:25:44.933 回答