2017-08-25 78 views
0

首先,我知道我的问题的标题是含糊不清的,但我不知道该怎么说。你会看到我的例子。如何将Lucene过滤器添加为动态条件?

在SQL查询中,可以将'1 = 1'应用于动态条件。

让我举个例子。

select * from PROD.EMPLY 
WHERE 1=1 
AND (NAME = 'JOHN' OR NAME = 'MARY' OR NAME = 'KEVIN') ; 

如上所述,我想应用下面的过滤器。

BooleanFilter BF = new BooleanFilter(); 
TermsFilter tf1 = new TermsFilter(); 
TermsFilter tf2 = new TermsFilter(); 

//tf1 => 1=1 

//tf2 => name condition 
tf2.addTerm("name", "JOHN"); 
tf2.addTerm("name", "MARY"); 
tf2.addTerm("name", "KEVIN"); 

BF.add(new FilterClause(tf1, Occur.MUST)); // 1=1 condition 
BF.add(new FilterClause(tf2, Occur.MUST)); // name condition 

但正如我希望的结果是不匹配的。(没有命中)

据我所知,这是因为有一个在Lucene中没有空/空搜索方法。 我还检查了是否可以用MatchAllDocsQuery来切换BooleanFilter/TermsFilter。

但是在我的情况下,我的Lucene版本很旧(2.3.2),我的版本中没有MatchAllDocsQuery,我不希望过滤器的条件影响lucene的评分。

我在stackoverflow和谷歌搜索,但没有匹配我的情况。

任何帮助将非常感激,并感谢您的阅读。

+0

这确实很旧,不得不下载源代码来检查,但是* *是*,实际上是2.3.2中的一个'MatchAllDocsQuery'。 – femtoRgon

+0

@femtoRgon感谢您的评论。感谢您的评论,我发现有MatchAllDocsQuery。但是,如果可能的话,我想使用过滤器而不是使用MatchAllDocsQuery,因为Query会影响Lucene的评分,而过滤器则不会。 – TwilighT

回答

0

我不想回答自己,但我希望我的不好解决方案可以帮助/激励有同样问题的人。

在我的情况,如上所述,我的Lucene版本是如此之低的版本,许多过滤器都受到限制。 但是,我不想使用查询,因为我不希望过滤器影响评分。

所以,我用“手动”过滤器清理了自己。 我的开发语言是Java,所以我使用了包含方法。

简要说明我的解决方案,如下所示。

  1. 使用AS-IS方法搜索Lucene。
  2. 在结果,比较与包含方法

例如(I加入这个步骤。):

if (result.contains("KEVIN")) { 
isFilteredResult = true; 
} else if (result.contains("JOHN")) { 
isFilteredResult = true; 
} 
... 
  • 包含条件的关键字的唯一结果显示。
  • 我很担心这个解决方案,因为这种方法是用Lucene而不是Java来完成的。所以,我猜想如此多的记忆会被消耗掉。 但是,性能并不差,因为我很担心,用户对性能和结果都满意。

    我知道这个解决方案不是很好的方法,但如果条件如此受限制,这种方式也是一个解决方案。

    感谢您的阅读。 如果有更好的解决方案,请让我知道。