Performance Lucene搜索耗时太长了

Performance Lucene搜索耗时太长了,performance,search,lucene,lucene.net,Performance,Search,Lucene,Lucene.net,一,;我在(目前)70Gig索引上使用Lucene.net(2.9.2.2)。。我可以做一个相当复杂的搜索,并在1~2秒内取回所有文档ID。。但实际加载所有点击量(在我的测试查询中大约70万次)需要5分钟以上的时间 我们没有使用lucene for UI,这是一个进程之间的数据存储,我们有数亿个预缓存的数据元素,我正在处理的部分从每个找到的文档导出一些特定的字段。(因此,分页不起作用,因为这是进程之间的导出) 我的问题是,获取搜索结果中所有文档的最佳方式是什么?目前,我正在使用一个自定义收集器(

一,;我在(目前)70Gig索引上使用Lucene.net(2.9.2.2)。。我可以做一个相当复杂的搜索,并在1~2秒内取回所有文档ID。。但实际加载所有点击量(在我的测试查询中大约70万次)需要5分钟以上的时间

我们没有使用lucene for UI,这是一个进程之间的数据存储,我们有数亿个预缓存的数据元素,我正在处理的部分从每个找到的文档导出一些特定的字段。(因此,分页不起作用,因为这是进程之间的导出)

我的问题是,获取搜索结果中所有文档的最佳方式是什么?目前,我正在使用一个自定义收集器(使用MapFieldSelector)对文档执行get操作作为其收集。。我还尝试在收集器完成后遍历列表。。但情况更糟

我对想法持开放态度:-)


提前感谢。

Hmmm,鉴于您在将“get”代码移到收集器外部时发现问题,听起来您的问题与I/O有关

考虑到索引的大小,我几乎不敢问这个问题,但您是否尝试过:

  • 优化指数
  • 清除硬盘碎片
如果是这样,对文档的检索率是否有显著影响?顺便说一句,如果我不稳定的数学是正确的,我每秒检索2333个项目

另外,对于正在检索的字段子集,是否有任何字段可以压缩?或者你已经尝试过压缩了


与此相关的是,70万个项目在你的索引中所占的比例是多少?了解I/O吞吐量会很有趣。您可能可以计算出您的计算机/硬盘组合的最大理论数据速率,并查看是否已经接近极限。

您需要搜索哪些字段?您需要存储哪些字段? Lucene.net可能不是存储和检索实际文档文本的最有效方法。
您的场景建议不存储任何内容,为所需字段编制索引并返回文档ID列表。文档本身可以存储在一个辅助数据库中。

您能否详细说明为什么需要为每个查询加载数十万次点击?我还没有见过这样的应用程序。对于您的700000个文档,总共有多少数据(大小)?如果数据量很大,则加载数据的速度不会超过磁盘读取数据的速度。另外,在阅读数据时,您对数据做了什么?将其写入磁盘?将其保存在内存中?这是一个导出过程。。要查找符合条件的配置文件。。匹配的配置文件都移交给另一个进程。该进程可能只是将ID导出给用户(异步),也可能对所有这些ID进行进一步处理。。要提取700000个文档的当前目标字段,我们需要大约100兆。。(在更糟的情况下可能会多一点,塞纳里奥)。。要提取整个文档,可能需要750~800兆)。是的,因为这是一个流程到一个流程,所以需要所有点击。因此,在您的示例中,加载700K文档的目标字段需要5分钟以上的时间,还是加载所有700K文档的整个文档?昨晚运行了一次优化。。今早5:00启动碎片整理(仍在运行)。。我会让你知道这是否加快了速度…-)不幸的是没有明显的区别。。做计算时,我坐在大约.51毫秒每文件(平均超过780000文件读取)。。这并不“坏”,我现在正在尝试字段缓存,但它(到目前为止)需要50分钟来加载(尚未完成)和5 1/2 Gig的ram。我认为字段缓存不会有帮助,除非您再次检索相同的文档。存储的数据非常小(最多几百字节)。。因此,从Lucene到另一个存储引擎可能不会更快(甚至更慢)。。因为每个documentID都会导致对另一个引擎的seporate调用。。除非我能以每毫秒3次或更多的速度打电话并得到结果,否则在这一点上可能比Lucene慢(不幸的是)。