【问题标题】:Lucene IndexSearcher#search(Query,int), impact of parameter nLucene IndexSearcher#search(Query,int),参数n的影响
【发布时间】:2014-02-22 19:13:11
【问题描述】:

我有一个大约 9 Mio 的 Lucene 索引。文档,它们使用BooleanQuery 查询,该TermQueries 组合了几个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)以获得最佳搜索性能。但在极少数情况下,可能会有更多结果,我也必须抓住。

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

【问题讨论】:

    标签: java performance lucene


    【解决方案1】:

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

    注意:如果通过 PriorityQueue(int,boolean) 构造函数将 prepopulate 设置为 true 进行实例化,则此类将预分配长度为 maxSize+1 的完整数组。

    我最终写了一个自定义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;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      相关资源
      最近更新 更多