java - Lucene通过ID检索文档速度慢

标签 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. 如果您不需要从索引中获取内容,而只需要搜索它,则应该将此字段更改为不存储:

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

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

  2. 如果您确实需要存储内容字段,但只是不需要此调用的内容,则可以传入 Set<String>包含您需要从 IndexReader.document 返回的字段的字段名称

    Set<String> getFields = Set.of({SearchField.FILE_ABSOLUTE_PATH.getName()});
    for(int i = 0; i < result.length; i++)
    {
        final Document document = reader.document(hits[i].doc, getFields);
        ...
    }
    

关于java - Lucene通过ID检索文档速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51196479/

相关文章:

java - 将分析数据从 Spark 插入到 Postgres

python - 复合索引 SQLModel

Python:如何在由数组和 NaN 组成的数据帧(panda)中建立索引

mysql - 这个 MySQL tinyblob key 的 "length"应该是什么?

elasticsearch - Elasticsearch发布荧光笔返回太多句子

python - 有纯 Python Lucene 吗?

java - 在java中打开并创建.lzh文件

java - 从服务器发送简单错误响应消息来调用 jQuery ajax 方法(例如,responseText)的最佳方法是什么?

java - Lucene - 返回按匹配字段数排序的结果

java - 安卓蓝牙配对: How to make sure to get bluetooth pairing request in the front dialog instead of a notification?