收集Lucene / Optimization中的所有匹配搜索

时间:2010-01-20 10:14:38

标签: optimization lucene

摘要:我使用自定义收集器收集给定搜索的所有匹配的文档ID(它使用ID填充BitSet)。根据我的需要,搜索和获取文档非常快,但是当涉及从磁盘中实际获取文档时,事情变得非常缓慢。有没有办法优化Lucene以加快文档收集?

详细信息:我正在处理维基百科的已处理语料库,并将每个句子作为单独的文档保留。当我搜索“计算机”时,我得到的所有句子都包含术语“计算机”。目前,搜索语料库并获取所有文档ID在亚秒内工作,但获取前1000个文档大约需要20秒。获取所有文档需要相应的时间(即每1000个文档批次另外20秒)。

后续搜索和文档获取花费的时间要少得多(但是,我不知道谁在进行缓存,操作系统或Lucene?)但我会搜索许多不同的术语,我不想依赖缓存,第一次搜索的表现对我来说至关重要。

我正在寻找可以提高文档获取性能的建议/技巧(如果可能的话)。提前谢谢!

附录

我使用Lucene 3.0.0,但我使用 Jython 来驱动Lucene类。这意味着,我为搜索过程中检索到的每个文档ID调用以下Jython类的get_doc方法:

class DocumentFetcher():  
  def __init__(self, index_name):  
    self._directory = FSDirectory.open(java.io.File(index_name))  
    self._index_reader = IndexReader.open(self._directory, True)  
  def get_doc(self, doc_id):  
    return self._index_reader.document(doc_id)  

我的索引中有50M文档。

2 个答案:

答案 0 :(得分:2)

您可能正在将大量信息存储在文档中。尽可能减少存储的字段。

其次,在检索字段时,只选择您需要的字段。您可以使用以下IndexReader方法仅指定几个存储的字段。

public abstract Document document(int n, FieldSelector fieldSelector)

这样您就不会加载未使用的字段。

您可以使用以下代码示例。

FieldSelector idFieldSelector = 
new SetBasedFieldSelector(Collections.singleton("idFieldName"), Collections.emptySet());
for (int i: resultDocIDs) {
String id = reader.document(i, idFieldSelector).get("idFieldName");
}

答案 1 :(得分:1)

Scaling Lucene and Solr讨论了许多改善Lucene性能的方法。 当您在维基百科内进行Lucene搜索时,您可能会对Rainman's Lucene Search of Wikipedia感兴趣。他主要讨论算法和较少的性能,但这可能仍然是相关的。