java - 使用 Lucene 搜索有多少结果?

标签 java lucene

在我的应用程序中,我使用 Lucene (4.8) 作为搜索引擎。

我使用 IndexSearcher 确定 10 个 docId,然后从数据库加载完整的 10 文档。使用以下方法时,我的问题是:n 应该有多大?

search(Query query, Filter filter, int n, Sort sort)

该应用程序还支持分页,因此理论上n可以是Integer.MAX_VALUE,并且在搜索之后我确定了我想要的10 docIds,所以于...

但是这是一个好方法吗?

我的意思是,如果有可能指定偏移量,我可以在此步骤中进行分页,并在获取 10 文档后结束搜索过程。

最后:仅搜索 10 而不是 Integer.MAX_VALUE 文档会带来巨大的加速吗?

附注我无法自己测试最后一个问题,因为我的数据库没有那么大,看不到任何差异......但当它上线时它会大得多。

最佳答案

首先,即使您指定 Integer.MAX_VALUE,它也会向下舍入到最大文档 ID - 搜索超出最大绝对限制是没有意义的。

关于加速 - 没有人会给你准确的答案,因为每个索引都是不同的。但还是有一些共同点。

  • 对于每次搜索,都会为结果分配新的Object[size](org.apache.lucene.util.PriorityQueue:64 - 这是 Lucene 版本 4.9.0,行号可能因版本而异)
  • org.apache.lucene.search.IndexSearcher:467 处还有另一个分配,其中 ScoreDoc 数组使用(相同?)数字进行初始化。
  • 显然,设置每个数组元素都会产生 CPU 和 I/O 成本

即使初始化每个搜索结果都很便宜,但对于大型索引来说,它会增加。此外,对这些大块进行垃圾收集是要付出代价的。想象一下,如果您每秒运行搜索 10 次,并获得 100 万个搜索结果。这对于 GC 来说是一个很大的工作量!因此,如果您可以采取一些措施来修剪搜索结果,那就去做吧。

但是,上述建议(以及任何其他建议)只有在您的上下文之外才有意义。测量,不要猜测!修剪是一种可以留待以后进行的优化——如果您负担得起的话。

关于java - 使用 Lucene 搜索有多少结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26294603/

相关文章:

linq - 使用 IRavenQueryable 的 RavenDB 全文搜索字典

java - 为什么我的应用程序崩溃(复选框)

java - 父级有子级列表或子级有父级引用

java - 凯撒的密码

elasticsearch - Elasticsearch从快照还原单个索引

java - 如何提取相似的短语?

java - 对用户隐藏 Javafx 实现

java - 我可以在将对象与另一个数组进行比较时更改对象的一个​​值吗?

java - 是否可以使用 Hibernate Search 5.X 对 @Id 字段使用数字编码

indexing - 数据已索引后如何更改 solr 字段类型