当字段设置为“ stored = false”时,Solr文档的分数会更改

时间:2019-01-18 14:42:05

标签: solr

我很困惑,因为当我不再存储特定字段时,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文档中,这是我期望的(和预期的)。

但是我不了解更改的分数,因为该字段仍被索引(就像以前一样),并且我不希望该字段是否存储会影响分数。此外,官方文件似乎并不暗示类似的东西。

我想念什么吗?

1 个答案:

答案 0 :(得分:0)

我发现我的应用程序在启动时会进行一些原子更新。 考虑到这个术语,我找到了以下文章Solr Atomic Update - update documents with fields that are indexed but not stored(由于标题中有错字,我以前没有找到它。)

此答案说明了为什么存储字段丢失了。不幸的是,由于我使用的是TextField类型,因此无法使用docValues =“ true”,并且必须寻找其他解决方法。

编辑:我们选择使用DocTransformer作为一种变通办法,以便保留所讨论的字段,但可以通过转换器将其从Solr文档中删除。