我有一个单核[1],非复制的Solr索引,包含大约4000万个文档。每个文档都有两个字段,一个存储,另一个不存储。我搜索非存储字段,存储的字段是我的结果。
此索引的响应时间约为8秒。需要注意的是,我没有做出我认为典型的全文查询。每个查询都包含许多OR术语。我预计这会很慢,但不会那么慢。
我注意到的一点是,Solr只使用了其JVM可用的7GB中的几百MB。它不能将大部分索引保留在内存中。这引出了我的问题:有没有办法配置solr,以便它被迫在RAM中维护很多(或至少更多)索引?
[1] Sharding为我带来了一个问题。在我的Solr应用中,相对分数非常重要。分片本地评分意味着我拥有的分片越多,得分就越不准确。
回应评论的更多信息:
这是我搜索的字段的字段类型定义:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
这是一个示例查询:
(Carberry J 2008 Toward a Unified Theory of High-Energy Metaphysics Silly String Theory Journal of Psychoceramics 5 11 1 3)
这将需要大约10秒来响应,而具有较少ORed术语的查询(例如(Carberry 2008))将在~100ms内返回。
答案 0 :(得分:5)
我相信我已经找到并解决了我遇到的问题。
原来我的许多文档,因为它们由书目元数据组成,在通常的英文停用词之上包含一些非常常见的单词。这些词包括“期刊”和“诉讼”。此外,因为我的文档包含作者姓名,通常包括姓名缩写,其中许多包含索引的单字母术语。如果将这些中的任何一项作为查询术语包含在内,则响应时间将增加一个数量级。
我的解决方案是使用StopFilter和LengthFilter简单地过滤掉这些常用术语,如下所示:
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LengthFilterFactory" min="2" max="100"/>