1

在索引时,我提升了一小部分文档的别名字段,将提升设置为 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

您可以看到第一个文档(被索引提升)的 fieldnorm 为 7.5161928 E9(注意 E),而下一个结果为 1.0。基本上,只要这些增强文档中的一个在其别名字段上匹配,它将始终是第一个结果,一旦结果标准化,它将获得 100 分,而所有其他结果的得分为零。

如果我删除了提升,那么事情会按预期工作(但问题是我需要对这些文件进行某种提升,但现在没有)

http://search.beta.musicbrainz.org/?type=artist&query=Jean&explain=true

为什么将字段提升到 2.0 会产生如此显着的效果

4

1 回答 1

0

这似乎很奇怪,是的。您的代码中没有任何内容可以明确导致这种情况,但我非常怀疑。

我不太清楚 an 是什么MbDocument样子,但我猜它可以有多个同名的字段。我猜想 JS Bach 实际上有大约 30 个名为ArtistIndexField.ALIAS.getName().

这里的问题是 Lucene 如何处理具有相同名称的多个文档。Lucene 将它们全部附加到同一个字段中,并将它们的 boost 相乘

所以而不是像这样的表示:

alias1^2
alias2^2
alias3^2
....

你最终会得到类似的东西:

(alias1 alias2 alias3 ...)^(2^30)

您需要自己将它们全部连接到一个字段中(确保连接的术语之间有空格,以免在索引时它们一起进入一个术语),或者确保只有一个为别名添加的字段将被提升添加到文档时。

我只是提供这个链接,作为一个友好的建议。用它做你认为合适的事情。

于 2013-04-04T16:24:38.527 回答