首先,我知道我的问题的标题是含糊不清的,但我不知道该怎么说。你会看到我的例子。如何将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和谷歌搜索,但没有匹配我的情况。
任何帮助将非常感激,并感谢您的阅读。
这确实很旧,不得不下载源代码来检查,但是* *是*,实际上是2.3.2中的一个'MatchAllDocsQuery'。 – femtoRgon
@femtoRgon感谢您的评论。感谢您的评论,我发现有MatchAllDocsQuery。但是,如果可能的话,我想使用过滤器而不是使用MatchAllDocsQuery,因为Query会影响Lucene的评分,而过滤器则不会。 – TwilighT