gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:06:32 27 4
gpt4 key购买 nike

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com