我已构建自定义字段类型以提高搜索相关性,我已使用此配置定义了名为text_bag
的新类型:
<fieldType name="text_bag" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
<analyzer type="index">
<tokenizer class="solr.ClassicTokenizerFactory" />
<filter class="solr.ClassicFilterFactory" />
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
<filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" />
<filter class="solr.FlattenGraphFilterFactory" />
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" />
<filter class="solr.FlattenGraphFilterFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
<filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="0" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.ShingleFilterFactory" tokenSeparator="" maxShingleSize="3" />
</analyzer>
</fieldType>
顺便说一句,synonyms.txt
的大小非常小。
对于schema.xml
,我将这些配置添加到我的收藏中:
<field name="keywords_bag" type="text_bag" indexed="true" stored="false" multiValued="true" required="false" />
<copyField source="name" dest="keywords_bag" />
<copyField source="category" dest="keywords_bag" />
<copyField source="location" dest="keywords_bag" />
<copyField source="tags" dest="keywords_bag" />
<copyField source="keywords" dest="keywords_bag" />
所有这些源字段只是一个字符串,平均长度约为100-200个字符,项目数平均每个字段大约10-20个项目。
将这些配置部署到生产工作负载几个小时后,Solr服务器消耗了所有可用内存(5GB),它通常只使用2GB并使用100%CPU时间。
我使用具有云功能的Solr 6.5.0,群集中有3台服务器。
有没有人注意到配置有任何问题?
答案 0 :(得分:0)
经过多次查询模式测试后,ShingleFilter可以产生大量的术语,导致QueryParser处理这些术语,因此需要大量的内存。
我使用-Xmx1g测试了Solr 6.5.0,6.5.1,7.0.1然后将15个术语传递给此查询分析器,它只需要10个并发请求,它会消耗所有1GB内存,而不会按时响应请求。 / p>
我已在此处发送了一个问题https://issues.apache.org/jira/browse/SOLR-12084