gpt4 book ai didi

java - Lucene IndexSearcher#search(Query,int),参数n的影响

转载 作者:行者123 更新时间:2023-11-30 04:01:12 24 4
gpt4 key购买 nike

我的 Lucene 索引约为 9 Mio。文档时,使用 BooleanQuery 进行查询,该 boolean 查询由多个 TermQueries 组合而成(组合为 AND)。非常基本。我的搜索通常会产生大约 10 个文档的结果,但在极少数情况下,我可能会得到更多的结果。我正在做的事情如下:

TopDocs searchResult = searcher.search(query, MAX_RESULT_COUNT);
for (int i = 0; i < searchResult.scoreDocs.length; i++) {
Document document = searcher.doc(searchResult.scoreDocs[i].doc);
// read data from index fields and create result instances here
}

出于我的天真,我最初将 MAX_RESULT_COUNT 设置为 Integer.MAX_VALUE,因为我认为,如果搜索通常只得到 10 个结果,那么最大值并不重要无论如何,这个值永远不会达到。巨大的错误。我发现,MAX_RESULT_COUNT 设置得越低,搜索速度就越快。

现在,如前所述,我可以设置一个相对较低的值(例如 100)以获得最佳搜索性能。但在某些罕见的情况下,可能会有更多结果,我也必须捕获。

有人可以向我解释一下,为什么这个值对搜索速度有如此大的影响,尽管实际可用结果的数量要少得多?是否有一种优雅的方式来获取所有可用结果并仍然获得尽可能高的性能?

最佳答案

快速浏览一下代码后,我在 PriorityQueue 中找到了以下注释的 JavaDocs 并假设我的问题是由大小为 Integer.MAX_VALUE 的数组分配引起的:

NOTE: This class will pre-allocate a full array of length maxSize+1 if instantiated via the PriorityQueue(int,boolean) constructor with prepopulate set to true.

我最终写了一个自定义Collector 。由于我不需要评分,并且文档的顺序与我的情况无关,因此这很简单:

private static final class SimpleCollector extends Collector {
final Set<Integer> docs = CollectionHelper.newHashSet();
int docBase;

@Override
public void setScorer(Scorer scorer) throws IOException {
// no scoring
}

@Override
public void collect(int doc) throws IOException {
docs.add(docBase + doc);
}

@Override
public void setNextReader(AtomicReaderContext context) throws IOException {
this.docBase = context.docBase;
}

@Override
public boolean acceptsDocsOutOfOrder() {
return true;
}

}

关于java - Lucene IndexSearcher#search(Query,int),参数n的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21959137/

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