【问题标题】:Score for Solr documents changes when field is set to "stored=false"当字段设置为“stored=false”时,Solr 文档的分数会发生变化
【发布时间】:2019-01-18 14:42:04
【问题描述】:

我很困惑,因为当我不再存储特定字段时,Solr 计算的分数会发生变化。

在我的 schema.xml 中,我通过以下方式使用动态字段(Solr 版本为 7.5):

<dynamicField name="*_fct_c" type="text_default" omitNorms="false"/>

类型“text_default”定义为:

<fieldType name="text_default" class="solr.TextField" positionIncrementGap="100" indexed="true" stored="true" multiValued="false" omitNorms="true">
        <analyzer type="index">
            <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[\p{Punct}&amp;&amp;[^\-_]]" replacement=" "/>
            <tokenizer class="solr.WhitespaceTokenizerFactory" />
            <filter class="solr.WordDelimiterGraphFilterFactory"
                    generateWordParts="1" generateNumberParts="1" catenateWords="0"
                    catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"
                    splitOnNumerics="0" preserveOriginal="1" />
            <filter class="solr.LowerCaseFilterFactory" />
        </analyzer>
        <analyzer type="query">
            <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[\p{Punct}&amp;&amp;[^\-_\?\*]]" replacement=" "/>
            <tokenizer class="solr.WhitespaceTokenizerFactory" />
            <filter class="solr.WordDelimiterGraphFilterFactory"
                    generateWordParts="1" generateNumberParts="1" catenateWords="0"
                    catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"
                    splitOnNumerics="0" preserveOriginal="1" />
            <filter class="solr.LowerCaseFilterFactory" />
        </analyzer>
    </fieldType>

我将字段定义更改为:

<dynamicField name="*_fct_c" type="text_default" omitNorms="false" stored="false" />

更改后,我在更改字段中包含搜索词的所有文档都获得了不同的分数。

该字段未包含在返回的 Solr 文档中,这是我所期望的(和预期的)。

但我不明白更改后的分数,因为该字段仍然被索引(就像以前一样),我没想到该字段是否存储会影响分数。官方文档似乎也没有这样的暗示。

我错过了什么吗?

【问题讨论】:

  • 您是否两次都删除了索引并从干净的索引开始?否则,如果您只是重新索引,则索引中已删除文档的数量将在两者之间有所不同(并且它们仍然会影响分数,直到它们被删除(即索引已优化或发生索引合并)。
  • 两次索引都是从头开始构建的,所以删除文档的数量为零。
  • 我将尝试找到一个可以在不使用我的应用程序的情况下重现的最小示例。

标签: solr


【解决方案1】:

我发现我的应用程序在启动时会进行一些原子更新。 想到这个词,我找到了下面的文章Solr Atomic Update - update documents with fields that are indexed but not stored(我想我之前没有找到它,因为标题错字了)。

这个答案解释了为什么存储的字段会丢失。不幸的是,我无法使用 docValues="true",因为我使用的是 TextField 类型,因此必须寻找另一种解决方法。

编辑:我们选择使用 DocTransformer 作为解决方法,以便相关字段保持存储,但可以通过转换器从 Solr 文档中删除。

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多