当使用太多子句时,Lucene.Net内存消耗和慢速搜索

时间:2010-06-18 13:58:30

标签: optimization lucene.net search

我有一个包含文本文件属性和文本文件主键ID的数据库 索引大约100万个文本文件及其ID(DB中的主键)。

现在,我正在两个层面进行搜索。 首先是直接数据库搜索,其中我得到主键(大约2或3百万个ID)

然后我做一个布尔查询,例如如下

+文字:“测试*”+(pkID:1 pkID:4 pkID:100 pkID:115 pkID:1041 ....)

并在我的索引文件中搜索。

问题是这样的查询(有200万个子句)花费太多时间来给出结果并且消耗过多的内存....

这个问题有优化解决方案吗?

2 个答案:

答案 0 :(得分:2)

假设您可以重用查询的dbid部分:

  1. 将查询拆分为两部分:一部分(文本查询)将成为查询,另一部分(pkID查询)将成为过滤器
  2. 将两个部分都纳入查询
  3. 将pkid查询转换为过滤器(使用QueryWrapperFilter)
  4. 将过滤器转换为缓存过滤器(使用CachingWrapperFilter)
  5. 可能通过某种词典
  6. 挂在过滤器上
  7. 下次进行搜索时,请使用允许您使用查询和过滤的重载
  8. 只要pkid搜索可以重复使用,你就应该有很大的改进。只要您不优化索引,缓存的效果甚至应该通过提交点(我理解位集是基于每个段计算的)。

    HTH


    P.S。

    我认为如果不注意我会认为你通过这样使用它来对你的索引进行各种滥用将是我的疏忽!

答案 1 :(得分:1)

最佳优化不是使用带有200万个子句的查询。无论您如何优化,任何包含200万个子句的Lucene查询都会运行缓慢。

在您的特定情况下,我认为首先使用+Text:"test*"查询搜索索引更为实际,然后通过在Lucene命中运行数据库查询来限制结果。