我正在为数据建立索引,并且我注意到搜索需要很长时间。我正在存储文件的内容和文件路径。
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
字段,它也必须从磁盘上加载所有文件内容。如果这是问题所在,那么我可能不得不更改数据存储方式。
这可能是什么原因?
答案 0 :(得分:1)
是的,如果内容字段很长,则可能会使速度变慢。
此处提供两种解决方案:
如果您永远不需要从索引中获取内容,只需要搜索它,就应该将此字段更改为未存储:
document.add(new TextField(SearchField.CONTENT.getName(), fileData.getContent(), Field.Store.NO));
这将减小从索引传回的结果的大小,也将减小索引本身的大小。
如果您要做需要存储内容字段,但只是不需要此内容,则可以传入包含{从IndexReader.document
Set<String>