使用Lucene对小文档进行高效的位置查询

时间:2013-09-30 11:13:39

标签: java search solr lucene indexing

我有一个由数十亿个小文档(~200个char / doc)组成的大型数据集。 执行位置查询并获得最佳三个文档的最有效方法是什么?

我的想法不是创建一个位置索引并在整个数据集上执行这样的查询,而是使用简单的布尔查询的结果动态构建位置索引,然后执行位置查询以获得最佳的三个我需要的文件。

所以,而不是: 十亿个文档 - >建立一个正面指数 - >执行位置查询 - >得到最好的三个文档

我想做以下事情: 十亿个文档 - >建立一个正常的索引 - >执行布尔查询 - >得到最好的250(高数字) - >用结果建立一个内部位置索引 - >执行位置查询 - >得到最好的三个文档。

我认为通过这样做,我将通过支付一个小的近似来减少搜索时间。 是否有其他/更好的解决方案呢?

2 个答案:

答案 0 :(得分:1)

我会尝试使用搜索过滤器。也许TermsFilter可能是足够的,但相当肯定的是QueryWrapperFilter。如果缓存过滤器的结果是有益的,可以用CachingWrapperFilter包裹它们。

当传递给您的IndexSearcher.search来电时,这会限制查询搜索过滤器接受的那些文档。

由于您已添加标记,因此也可以使用fq parameter在过滤器中使用过滤查询。

答案 1 :(得分:0)

同意femtoRgon。如果您的位置查询中出现相同的术语,您还可以考虑缓存位置查询的(子)结果。

让我们假设您使用SpanQuery对象,您可以自己引入CachingSpanQuery类,以某种方式存储生成的Spans。为了提高效率,您需要一种压缩方式来存储位置信息。