[英]Why does index boosting a field to on a document have such a dramatic effect in Lucene 4
在索引时,我将一小部分文档的别名字段增强,将boost设置为2.0f,我认为这意味着将该文档的分数加倍会超过另一个文档,而其他所有条件都是相同的。
public class ArtistBoostDoc {
//Double the score of this doc if it comes up in search
private static float ARTIST_DOC_BOOST = 2.0f;
private static Set<String> artistGuIdSet = new HashSet<String>();
static {
artistGuIdSet.add("24f1766e-9635-4d58-a4d4-9413f9f98a4c"); //Bach
artistGuIdSet.add("1f9df192-a621-4f54-8850-2c5373b7eac9"); //Beethoven
artistGuIdSet.add("b972f589-fb0e-474e-b64a-803b0364fa75"); //Mozart
artistGuIdSet.add("ad79836d-9849-44df-8789-180bbc823f3c"); //Vivaldi
artistGuIdSet.add("27870d47-bb98-42d1-bf2b-c7e972e6befc"); //Handel
artistGuIdSet.add("8255db36-4902-4cf6-8612-0f2b4288bc9a"); //Johann Strauss II
artistGuIdSet.add("eefd7c1e-abcf-4ccc-ba60-0fd435c9061f"); //Richard Wagner
artistGuIdSet.add("4e60a56a-514a-4a19-a3cc-49927c96b3cb"); //Sir Edward Elgar
artistGuIdSet.add("c130b0fb-5dce-449d-9f40-1437f889f7fe"); //Joseph Haydn
artistGuIdSet.add("f91e3a88-24ee-4563-8963-fab73d2765ed"); //Franz Schubert
artistGuIdSet.add("c70d12a2-24fe-4f83-a6e6-57d84f8efb51"); //Johannes Brahms
artistGuIdSet.add("f1bedf1f-4445-4651-9c35-f4a3f3860a13"); //Guiseppe Verdi
}
public static void boost(String artistGuid, MbDocument doc) {
boost(artistGuid,doc.getLuceneDocument());
}
public static void boost(String artistGuid, Document doc) {
if(artistGuIdSet.contains(artistGuid)) {
for(IndexableField indexablefield:doc.getFields())
{
if(indexablefield.name().equals(ArtistIndexField.ALIAS.getName()))
{
Field field = (Field)indexablefield;
field.setBoost(ARTIST_DOC_BOOST);
}
}
}
}
}
但是然后当我运行此查询时:
http://search.musicbrainz.org/?type=artist&query=Jean&explain=true
您可以看到第一个文档(已索引增强)的字段范数为7.5161928 E9(请注意E),而下一个结果为1.0。 基本上,只要这些增强文档中的一个在其别名字段上匹配,它将始终是第一个结果,对结果进行规范化后,其得分将为100,其他所有结果的得分为零。
如果我删除了增强功能,那么一切都会按预期进行(但麻烦的是,我需要这些文档的某种增强功能,但现在还没有)
http://search.beta.musicbrainz.org/?type=artist&query=Jean&explain=true
为什么将领域提升到2.0才有如此巨大的效果
好像很奇怪,是的。 您的代码中没有任何东西最终会导致这种情况,但我对此深有怀疑。
我不太了解MbDocument
外观,但是我猜它可以包含多个具有相同名称的字段。 我猜想JS Bach实际上有大约30个字段,名称为ArtistIndexField.ALIAS.getName()
。
Lucene如何处理具有相同名称的多个文档。 Lucene将它们全部添加到同一字段中,并将它们的boost乘以 。
因此,而不是像这样的表示形式:
alias1^2
alias2^2
alias3^2
....
您最终会得到类似:
(alias1 alias2 alias3 ...)^(2^30)
您要么需要自己将它们全部串联到一个字段中(请确保所连接的术语之间有空格,以免在索引时它们一起成为一个术语),或者确保仅增加为别名添加的一个字段添加到文档中时。
我将提供此链接 ,作为一些友好的建议。 用它认为合适的方法来做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.