1

我有一个包含约 4000 万个文档的单核 [1]、非复制 Solr 索引。每个文档有两个字段,一个存储,另一个不存储。我搜索非存储字段,存储字段是我的结果。

该索引的响应时间约为 8 秒。需要注意的是,我没有进行我认为典型的全文查询。每个查询包含几十个 OR 术语。我预计这会很慢,但没有现在那么慢。

我注意到 Solr 只使用了它的 JVM 可用的 7GB 中的几百 MB。它不能将大部分索引保留在内存中。这引出了我的问题:有没有办法配置 solr,使其被迫在 RAM 中维护大部分(或至少更多)索引?

[1] 分片给我带来了一个问题。相对分数在我的 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),将在大约 100 毫秒内返回。

4

1 回答 1

5

我相信我已经找到并解决了我遇到的问题。

事实证明,我的许多文档,因为它们是由书目元数据组成的,在通常的英语停用词之上包含一些非常常见的词。这些词包括“期刊”和“诉讼”。此外,由于我的文档包含作者姓名,通常包括首字母缩写,因此其中许多包含索引的单字母术语。如果将其中任何一个作为查询项包含在内,则响应时间将增加一个数量级。

我的解决方案是使用 StopFilter 和 LengthFilter 简单地过滤掉这些常用术语,如下所示:

<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LengthFilterFactory" min="2" max="100"/>
于 2012-08-08T12:59:50.820 回答