Lucene中的规范是什么?

14

我不理解它们是什么,真的很希望有一个简单的解释,展示它们为世界带来了什么价值,而不涉及太多实现细节。


http://lucene.472066.n3.nabble.com/What-are-norms-td540857.html - Matt Ball
@MattBall:似乎没什么意义。 - Robert Harvey
使用规范化的缺点是需要额外的内存来进行搜索(我认为每个字段每个文档需要一字节,所以假设所有文档都有相同的20个字段,100万个文档意味着大约分配了1B * 20 * 1000000 = 约20MB的内存用于规范化)。禁用规范化的缺点是无法进行字段和文档加权。因此,如果您正在索引只有一堆短字段的关系型数据库,则可能不关心规范化,并且可以禁用以减少搜索期间所需的内存。但是当我索引RDBMS数据时,我会保留规范化..内存很便宜,而且通常需要索引注释列等。 - nothingisnecessary
2个回答

15

规范是得分计算的一部分。规范可以按任意方式计算,但主要区别在于它是在索引时间计算的。通常,影响得分的其他因素是基于文档与查询的匹配程度在查询时间内计算的。通过将norm与文档一起存储,可以节省查询性能。

标准实现可以在Lucene的TFIDFSimilarity中找到并详细描述。在那里,它是设置字段加权值的乘积(如果在字段上设置了多个,则是所有字段加权值的乘积)和“lengthNorm”的乘积(这是一个设计用于更重视短文档匹配的计算因素)。由于它们都不依赖于查询的组成,因此在索引时间计算和存储是一个好选择。

然后,它们以压缩的、高度丢失的单字节格式存储(大约有1个有效小数位的精度)。


3
谢谢,但我不太明白你的意思。我想知道"norm"是什么,它解决了什么问题。据我所知,这更多是一个实现细节。请想象我是个不太聪明的人 :) - Nick
1
它确切地做什么取决于实现。我将评分逻辑应用于一个与特定查询无关的字段。在默认实现中,它应用字段增强,并提高短字段上的命中率,以使其比较长的字段更具相关性(因为通常情况下,10个中的2比1000个中的2更相关)。 - femtoRgon

8

当您进行索引、处理源信息时,会将某些文档和字段视为比其他文档和字段更重要的内容。

例如,任务是监视同事的电子邮件。标题字段中的单词匹配比正文字段中的单词匹配更重要。我们通过将标题字段中的匹配数量乘以一个大于正文字段匹配所使用的数字来实现这一点。

可索引电子邮件记录示例

+----+-------------+--------------+
| ID | Title       | Body         |
|----+-------------+--------------|
| 7  | Back Monday | Ben was sick |
| 8  | I'm sick    | cover for me |
| 9  | Help        | I am stuck   |
+----+-------------+--------------+

因此,搜索“sick”并将标题匹配乘以4和正文匹配乘以2,并按最高分数排序 - 文档的排名为ID 8第一和ID 7第二(请参见下面的表1)。

表格1:按得分排序的单词“sick”的匹配项(降序)

+----+---------+--------+-----------------------+
| Id | Title   | Body   | Score                 |
|    | Matches | Matches|                       |
|----+---------+--------+-----------------------|
| 8  | 1       | 0      | (1 * 4) + (0 * 2) = 4 |
| 7  | 0       | 1      | (0 * 4) + (1 * 2) = 2 |
+----+---------+--------+-----------------------+

我们要用4和2这两个数字来乘以比赛中的“规范”。


1
应该先是ID 8(因为标题中有“生病”一词),然后是ID 7(该词在正文中)。 - Neets
2
是的,谢谢您的纠正!我让多少人感到困惑了? - notapatch
1
@notapatch 文档的排名应该是ID 9排在第一位,ID 8排在第二位,9应该是8,8应该是7。 - Jason Law
谢谢你发现了这个问题,Jason。已经更新! - notapatch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接