Lucene通过ID缓慢检索文档

时间:2018-07-05 16:52:43

标签: java indexing lucene

我正在为数据建立索引,并且我注意到搜索需要很长时间。我正在存储文件的内容和文件路径。

document.add(new StringField(SearchField.FILE_ABSOLUTE_PATH.getName(), fileData.getFilePath().toString(), Field.Store.YES));
document.add(new TextField(SearchField.CONTENT.getName(), fileData.getContent(), Field.Store.YES));

搜索完成后,它将循环浏览文档ID,并检索存储在字段中的文件路径。此循环需要很长时间。

final TotalHitCountCollector collector = new TotalHitCountCollector();

searcher.search(query, collector);

final TopDocs docs = searcher.search(query, Math.max(1, collector.getTotalHits()));

final ScoreDoc[] hits = docs.scoreDocs;

final SearchResult[] result = new SearchResult[hits.length];

for(int i = 0; i < result.length; i++)
{
    final Document document = reader.document(hits[i].doc);
    result[i] = new SearchResult(Paths.get(document.get(SearchField.FILE_ABSOLUTE_PATH.getName())));
}

我想知道是否需要很长时间才能检索文档,因为即使我不访问CONTENT字段,它也必须从磁盘上加载所有文件内容。如果这是问题所在,那么我可能不得不更改数据存储方式。

这可能是什么原因?

1 个答案:

答案 0 :(得分:1)

是的,如果内容字段很长,则可能会使速度变慢。

此处提供两种解决方案:

  1. 如果您永远不需要从索引中获取内容,只需要搜索它,就应该将此字段更改为未存储:

    document.add(new TextField(SearchField.CONTENT.getName(), fileData.getContent(), Field.Store.NO));
    

    这将减小从索引传回的结果的大小,也将减小索引本身的大小。

  2. 如果您要做需要存储内容字段,但只是不需要此内容,则可以传入包含{从IndexReader.document

    返回的所需字段的字段名称
    Set<String>