【问题标题】:Solr: fieldNorm different per document, with no document boostSolr:每个文档的 fieldNorm 不同,没有文档提升
【发布时间】:2011-03-07 09:12:52
【问题描述】:

我希望我的搜索结果按分数排序,他们正在这样做,但分数计算不正确。也就是说,不一定不正确,但与预期不同,我不知道为什么。我的目标是删除任何改变分数的东西。

如果我对两个对象执行匹配的搜索(其中 ObjectA 的得分应该高于 ObjectB),则首先返回 ObjectB。

假设,对于这个例子,我的查询是一个词:“apples”。

ObjectA 的标题:“apples are apples”(2/3 术语)
ObjectA 的描述:“苹果里有苹果——苹果,现在苹果到了所有的苹果上!” (6/18 学期)
ObjectB 的标题:“苹果很棒”(1/3 术语)
ObjectB 的描述:“苹果房里有苹果,现在苹果都坏了!” (4/18 学期)

标题字段没有提升(或者更确切地说,提升 1),描述字段提升 0.8。我没有通过 solrconfig.xml 或通过我正在传递的查询指定文档提升。如果有另一种指定文档提升的方法,我可能会遗漏一个。

分析explain 打印输出后,看起来ObjectA 正在正确地计算出比ObjectB 更高的分数,就像我想要的一样,除了一个 区别:ObjectB 的标题fieldNorm 总是高于 ObjectA 的。


下面是explain 打印输出。请注意:标题字段为mditem5_tns,描述字段为mditem7_tns

ObjectB:
1.3327172 = (MATCH) sum of:
  1.0352166 = (MATCH) max plus 0.1 times others of:
    0.9766194 = (MATCH) weight(mditem5_tns:appl in 0), product of:
      0.53929156 = queryWeight(mditem5_tns:appl), product of:
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.8109303 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of:
        1.0 = tf(termFreq(mditem5_tns:appl)=1)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        1.0 = fieldNorm(field=mditem5_tns, doc=0)
    0.58597165 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of:
      0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of:
        0.8 = boost
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.3581977 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of:
        2.0 = tf(termFreq(mditem7_tns:appl)=4)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.375 = fieldNorm(field=mditem7_tns, doc=0)
  0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of:
    0.999001 = 1000.0/(1.0*float(1)+1000.0)
    1.0 = boost
    0.2977981 = queryNorm

ObjectA:
1.2324848 = (MATCH) sum of:
  0.93498427 = (MATCH) max plus 0.1 times others of:
    0.8632177 = (MATCH) weight(mditem5_tns:appl in 0), product of:
      0.53929156 = queryWeight(mditem5_tns:appl), product of:
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.6006513 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of:
        1.4142135 = tf(termFreq(mditem5_tns:appl)=2)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.625 = fieldNorm(field=mditem5_tns, doc=0)
    0.7176658 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of:
      0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of:
        0.8 = boost
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.6634457 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of:
        2.4494898 = tf(termFreq(mditem7_tns:appl)=6)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.375 = fieldNorm(field=mditem7_tns, doc=0)
  0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of:
    0.999001 = 1000.0/(1.0*float(1)+1000.0)
    1.0 = boost
    0.2977981 = queryNorm

【问题讨论】:

    标签: solr lucene relevance solr-boost


    【解决方案1】:

    FieldNORm 由 3 个组件计算 - 字段的索引时间提升、文档的索引时间提升和字段长度。假设您没有提供任何索引时间提升,则差异必须是字段长度。

    因此,由于对于较短的字段值,lengthNorm 较高,对于 B 具有较高的标题 fieldNorm 值,它在标题中的标记数量必须少于 A。

    有关 Lucene 评分的详细说明,请参阅以下页面:

    http://lucene.apache.org/java/2_4_0/scoring.html http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Similarity.html

    【讨论】:

    • +1 以获得更多见解 - 谢谢!然而,不幸的是,您会在我的帖子中注意到我说明了字段(及其长度)是什么。两个对象都有 3 个标记的标题和 18 个标记的描述。 ObjectA的title有2/3的token匹配,ObjectB有1/3的匹配,匹配描述分别是6/18和4/18。所以,如果我明白你在说什么,lengthNorm 应该不会有任何影响。请问 - 我将如何设置索引时间提升?
    • 抱歉 - 我认为您的示例是虚构的,而不是实际值。在这种情况下,您在该字段中是正确的,长度不应该是一个因素。您可以通过多种方式在 Solr 中设置提升 - 如果您使用 SolrJ,我相信 SolrInputDocument 上有一个“setBoost”方法。但是,如果 Doc B 得到提升,那么描述字段中的 fieldNorm 也应该更高。您可能还想查看 Luke - 它允许您重建索引字段数据,以便查看真正被索引的内容。
    • 不,不是编造的——只是测试数据。 :) 我会看一下代码,看看索引时间提升是否发生了任何可疑的事情。我可能还会去看看卢克。感谢您的帮助。
    • 链接失效了。
    【解决方案2】:

    问题是由词干分析器引起的。它将“apples are apples”扩展为“apples appl are apples appl”,从而使该字段更长。由于文档 B 仅包含 1 个由词干分析器扩展的术语,因此该字段比文档 A 短。

    这会导致不同的 fieldNorms。

    【讨论】:

    • 您能否详细说明,或者提供链接?为什么“词干”会将我的领域扩展到它不是的领域?这似乎违反直觉! :)
    • 除非你写的第一个“appl”应该是“apple”?刚刚研究了词干,如果“苹果”被分解成它的根形式,那将是有道理的。所以 - 如果我有这个权利,请告诉我 - 你是说如果我更改所有对“apple”的引用并仅搜索“apple”,我应该按照我想要的顺序获得结果?
    • 我编辑了我的帖子,所以现在应该更清楚了。词干分析器使用“appl”作为“apple”和“apples”的根形式。所以如果你禁用词干,你应该得到你期望的结果。您还可以通过将术语添加到 protwords.txt 并更改 schema.xml 来排除词干。
    • 我不确定这是否正确 - 通常词干替换值,而不仅仅是增加它。试试9ol.es/porter_js_demo.html(或任何词干分析器),你会发现原件没有被保留。你有没有提到 solr 中的词干保留原件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多