- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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 thePriorityQueue(int,boolean)
constructor with prepopulate set totrue
.
我最终写了一个自定义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/
根据 http://wiki.apache.org/lucene-java/LuceneFAQ#Is_the_IndexSearcher_thread-safe.3F IndexSearcher 是线
我在 .net Web 应用程序中使用 Lucene API。我想对所有请求使用相同的 Indexsearcher 实例。因此,我将 Indexsearcher 实例存储在 http 缓存中。 这是我
我从阅读可用文档中了解到,应该在搜索之间共享 IndexSearcher 实例,以获得最佳性能,并且必须创建一个新实例才能加载对索引所做的任何更改。这意味着在创建指向同一目录的 IndexSearch
给定一个 Lucene Query 查询,我可以通过调用以下内容来获得结果和评分的解释: TopDocs results = searcher.search(query, 10); ScoreDoc[
我正在使用 Lucene 的 contrib/demo 目录中的 SearchFiles 类。我不想以分页形式搜索结果,而是希望检索与查询匹配的所有文档。有没有办法用现有的 API (3.4) 来做到
我收到以下错误消息java.lang.UnsupportedOperationException 使用Lucene搜索方法:topDocs = searcher.search(booleanQuery
我最近开始使用 Lucene.NET,但遇到了一些问题:我使用了 IndexWriter 来索引我在 C:\\TestIndex 中的文档,我猜是这样工作因为它生成了几个 .fnm, .frq, .c
在 Web 应用程序中,我为整个应用程序设置了一个 IndexReader 和一个相应的 IndexSearcher。 文档说它们是线程安全的,所以没关系,但是如果底层索引发生变化(例如 IndexW
我是 Lucene.net 新手,正在努力适应 search code from here这实际上在每个方法中创建了一个新的 Analyzer、IndexSearcher 和 IndexWriter
我有一个非常大的数据库(大约 3000 万条记录,每条记录至少有 26 个字段),我已使用 Apache Lucene Java 为其建立了索引。 我正在从两个字段构造一个查询。每个搜索词都可以出现在
我希望能够在 Lucene.Net 中同时进行多个客户端搜索和索引 是否可能且线程安全? 同一个 IndexSearcher 实例可以跨线程共享吗? 最佳答案 索引搜索可以并且应该跨线程共享。 诀
我正在对使用 Lucene 版本 3.6.1 的现有代码库进行一些更改。 IndexSearcher 已针对每个搜索请求进行实例化。 IndexReader reader = IndexReader
我的 Lucene 索引约为 9 Mio。文档时,使用 BooleanQuery 进行查询,该 boolean 查询由多个 TermQueries 组合而成(组合为 AND)。非常基本。我的搜索通常会
当我尝试创建 new IndexSearcher(fsDir) 类的对象时,它抛出 IOException read past EOF。搜索索引不是基于 RAM,而是基于 NFS(使用 FSDirec
在 Lucene 文档中指出,在整个应用程序中使用 IndexWriter 和 IndexSearcher 的一个实例是最快的。 目前我有一个 IndexWriter 的静态实例一直打开,还有一个 I
我正在使用 Lucene.net 3.0.3.0 (现在是最新版本)。我想知道是否使用 的单个实例IndexWriter 和 索引搜索器 在生产环境中是一个不错的选择(考虑线程安全)。我在文档中读到创
上下文: 辅助外观类正在为我的应用程序提供搜索方法。由于性能不是问题,因此会为每个查询创建一个新的 IndexSearcher。 对于每个查询,都会创建一个新的搜索器,如下所示: File index
我即将编写一个具有分布式索引的近实时搜索应用程序。现在我想知道在多个索引上实现搜索的正确方法是什么: 我已经阅读了有关 MultiSearcher 的信息,所以一种方法是: IndexSearcher
Lucene 文档指出 IndexSearcher 和 IndexWriter 的单个实例应该用于整个应用程序中的每个索引,并跨所有线程。此外,在重新打开索引之前,对索引的写入将不可见。 因此,我尝试
我想使用 Lucene 索引(版本 4.3.1)查找查询的总命中次数。 我明白我必须使用 https://lucene.apache.org/core/5_3_0/core/org/apache/lu
我是一名优秀的程序员,十分优秀!