我很困惑,因为当我不再存储特定字段时,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}&&[^\-_]]" 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}&&[^\-_\?\*]]" 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文档中,这是我期望的(和预期的)。
但是我不了解更改的分数,因为该字段仍被索引(就像以前一样),并且我不希望该字段是否存储会影响分数。此外,官方文件似乎并不暗示类似的东西。
我想念什么吗?
答案 0 :(得分:0)
我发现我的应用程序在启动时会进行一些原子更新。 考虑到这个术语,我找到了以下文章Solr Atomic Update - update documents with fields that are indexed but not stored(由于标题中有错字,我以前没有找到它。)
此答案说明了为什么存储字段丢失了。不幸的是,由于我使用的是TextField类型,因此无法使用docValues =“ true”,并且必须寻找其他解决方法。
编辑:我们选择使用DocTransformer作为一种变通办法,以便保留所讨论的字段,但可以通过转换器将其从Solr文档中删除。