Solr 动态字段炸毁索引大小
Solr dynamic field blowing up the index size
最近,我从solr 5.0升级到solr 6.4.1。我可以 运行 我的应用程序正常,但问题是 solr 6 的索引大小太大了。在 solr 5 中,索引大小约为 15GB,而在 solr 6 中,对于相同的数据,索引大小为 300GB!我无法理解是什么导致了 solr 6 中如此巨大的差异。
我已经能够识别出正在扩大索引大小的字段。具体如下。
<dynamicField name="*_note" type="text_general" indexed="true" stored="true" multiValued="true" />
<field name="textproperty" type="text_general" indexed="true" stored="false" multiValued="true" />
<copyField source="*_note" dest="textproperty"/>
注释掉该字段后,索引大小将减少到 10GB 以下。
该字段的类型为 text_general。下面是这个类型的定义。
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.HTMLStripCharFilterFactory" />
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="((?m)[a-z]+)'s" replacement="s" />
<filter class="solr.WordDelimiterFilterFactory" protected="protwords.txt" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.KStemFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="C:/Users/pratik/Desktop/solr-6.4.1_playground/solr-6.4.1/server/solr/collection1/conf/stopwords.txt" />
</analyzer>
<analyzer type="query">
<charFilter class="solr.HTMLStripCharFilterFactory" />
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="((?m)[a-z]+)'s" replacement="s" />
<filter class="solr.WordDelimiterFilterFactory" protected="protwords.txt" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.KStemFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="C:/Users/pratik/Desktop/solr-6.4.1_playground/solr-6.4.1/server/solr/collection1/conf/stopwords.txt" />
</analyzer>
</fieldType>
我为调试此问题所做的几件事:
- 我已确保字段类型定义与我在 solr 5 中使用的相同,并且在版本 6 中也有效。此字段类型认为 "stopwords" 的列表在索引期间被忽略。我提供了与我们在 solr 5 中使用的相同的停用词列表。我已经验证该文件的路径是正确的,并且它正在 solr admin UI 中正常加载。当我使用 solr admin UI 的 "Analysis" 选项卡分析这些字段时,我可以看到停用词被过滤掉了。但是,当我使用其中一些停用词进行查询时,我确实得到了结果,这让我认为可能正在为停用词编制索引。
知道什么可以在 solr 6 中将索引的大小增加这么多吗?
对于面临类似问题的任何人。对我来说,问题是导致索引大小不成比例增加的字段有一个字段类型("text_general"),其 omitNorms 的默认值不正确。在现场明确打开它可以解决问题。以下是我在 solr 邮件列表中的相关问题的link。
最近,我从solr 5.0升级到solr 6.4.1。我可以 运行 我的应用程序正常,但问题是 solr 6 的索引大小太大了。在 solr 5 中,索引大小约为 15GB,而在 solr 6 中,对于相同的数据,索引大小为 300GB!我无法理解是什么导致了 solr 6 中如此巨大的差异。
我已经能够识别出正在扩大索引大小的字段。具体如下。
<dynamicField name="*_note" type="text_general" indexed="true" stored="true" multiValued="true" />
<field name="textproperty" type="text_general" indexed="true" stored="false" multiValued="true" />
<copyField source="*_note" dest="textproperty"/>
注释掉该字段后,索引大小将减少到 10GB 以下。
该字段的类型为 text_general。下面是这个类型的定义。
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.HTMLStripCharFilterFactory" />
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="((?m)[a-z]+)'s" replacement="s" />
<filter class="solr.WordDelimiterFilterFactory" protected="protwords.txt" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.KStemFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="C:/Users/pratik/Desktop/solr-6.4.1_playground/solr-6.4.1/server/solr/collection1/conf/stopwords.txt" />
</analyzer>
<analyzer type="query">
<charFilter class="solr.HTMLStripCharFilterFactory" />
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="((?m)[a-z]+)'s" replacement="s" />
<filter class="solr.WordDelimiterFilterFactory" protected="protwords.txt" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.KStemFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="C:/Users/pratik/Desktop/solr-6.4.1_playground/solr-6.4.1/server/solr/collection1/conf/stopwords.txt" />
</analyzer>
</fieldType>
我为调试此问题所做的几件事:
- 我已确保字段类型定义与我在 solr 5 中使用的相同,并且在版本 6 中也有效。此字段类型认为 "stopwords" 的列表在索引期间被忽略。我提供了与我们在 solr 5 中使用的相同的停用词列表。我已经验证该文件的路径是正确的,并且它正在 solr admin UI 中正常加载。当我使用 solr admin UI 的 "Analysis" 选项卡分析这些字段时,我可以看到停用词被过滤掉了。但是,当我使用其中一些停用词进行查询时,我确实得到了结果,这让我认为可能正在为停用词编制索引。
知道什么可以在 solr 6 中将索引的大小增加这么多吗?
对于面临类似问题的任何人。对我来说,问题是导致索引大小不成比例增加的字段有一个字段类型("text_general"),其 omitNorms 的默认值不正确。在现场明确打开它可以解决问题。以下是我在 solr 邮件列表中的相关问题的link。