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

Rug*_*man 5 lucene optimization

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

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

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

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

附录:

我使用Lucene 3.0.0但我使用Jython来驱动Lucene类.这意味着,我为搜索期间检索到的每个doc 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)  
Run Code Online (Sandbox Code Playgroud)

我的索引中有50M文档.

Sha*_*ore 2

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

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

public abstract Document document(int n, FieldSelector fieldSelector)
Run Code Online (Sandbox Code Playgroud)

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

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

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