2012-03-07 22 views
0

我有很多字段,只能包含一个字词,或者我不希望他们如果拥有更多的字词,就不会让他们受到影响,并且我从不提升字段,所以我禁用这些字段的标准字段.Index.ANALYZED_NO_NORM或Field.Index.NOT_ANALYZED_NO_NORM。在搜索多个字段时,禁用一个字段上的规范是否优于其他字段?

但现在用,如果我搜索两个领域

fielda:term1 OR fieldb:term2 

和FIELDA启用了规范和fieldb不,并不意味着那场比赛fieldb的文档更容易得分超过匹配FIELDA的文档更好,因为比分为一个文件匹配只是FIELDA将结束在

weight = tf * idf * fieldnorm calculation. 

因为fieldnorm分数较低将小于一个,如果该字段包含不止一个学期

那不是我想要的,我只是想它包含了三个方面的得分以及对文档fieldb与之匹配的一个词上fieldb文件核对

我是否理解这个权利,关于fieldnorm的所有讨论都集中在它占用内存的事实上,并且如果您的域只包含一个术语,我不读它,因为它没有讨论它如何影响结果禁用规范的领域的明显优势超过了规范领域。

回答

0

我的建议不是将标准字段上的查询禁用标准的字段的查询混合在一起。禁用规范的要点是当查询仅用作过滤器(并且不会影响分数)时节省空间。

做你想做的事情的优雅方式是为你的领域提供两种不同的相似性。但是,此功能(per-field similarity)仅在当前的开发版本中可用。

+0

嗨,是的我知道相似模型已经在Lucene 4.0中打开了很多,但不幸的是我无法使用它。我不是那么确定的规范只针对我的情况下的过滤器禁用Im禁用它们来防止多个值被添加到一个字段,并且当它只有一个值时不能公平地与相同字段进行比较。但是你还没有回答我的主张是否正确:与没有规范的领域相比,没有规范的竞争有一个明显的提升。 – 2012-03-08 08:40:04

+0

这是正确的。在DefaultSimilarity中查看computeNorm的定义http://svn.apache.org/repos/asf/lucene/dev/branches/branch_3x/lucene/core/src/java/org/apache/lucene/search/DefaultSimilarity.java归一化因子对于禁用标准的字段为1,标准字段为1/sqrt(numTerms)。您可以覆盖computeNorm,以便将其结果乘以sqrt(3),以便具有3个项的字段与禁用了标准的字段具有相同的标准(但这是一种破解)。请注意,如果修改computeNorm的定义,则需要重新编制索引以使更改可见。 – jpountz 2012-03-08 09:19:28

+0

好的没有禁用规范的行为就好像该字段只包含一个单词,所以实际上任何只包含单个值的字段与其他字段相比也会有优势,尽管这可以通过idf可能工作方式相反,因为如果字段只包含单个值,则可能比索引更为常见。现在,即使我有每场相似,我也不太确定我会采取什么方法 – 2012-03-08 10:08:38