gpt4 book ai didi

optimization - 收集 Lucene/优化中搜索的所有命中

转载 作者:行者123 更新时间:2023-12-03 16:02:34 27 4
gpt4 key购买 nike

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

详情 :我正在处理维基百科的语料库,我将每个句子作为一个单独的文档。当我搜索“计算机”时,我会得到所有包含“计算机”一词的句子。目前,搜索语料库并获取所有文档 ID 的工作时间是亚秒级,但获取前 1000 个文档大约需要 20 秒。获取所有文档需要更多的时间(即每 1000 个文档批次又需要 20 秒)。

后续搜索和文档获取花费的时间要少得多(虽然,我不知道谁在做缓存,OS 还是 Lucene?)但我将搜索许多不同的术语,我不想依赖缓存,性能第一次搜索对我来说至关重要。

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

附录 :

我使用 Lucene 3.0.0,但我使用 Jython 来驱动 Lucene 类。这意味着,我为在搜索过程中检索到的每个文档 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)

我的索引中有 50M 文档。

最佳答案

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

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

public abstract Document document(int n, FieldSelector fieldSelector)

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

您可以使用以下代码示例。
FieldSelector idFieldSelector = 
new SetBasedFieldSelector(Collections.singleton("idFieldName"), Collections.emptySet());
for (int i: resultDocIDs) {
String id = reader.document(i, idFieldSelector).get("idFieldName");
}

关于optimization - 收集 Lucene/优化中搜索的所有命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2100518/

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