首先,我知道我的问题标题含糊不清,但我不知道怎么说。当你看到我的例子时,你会知道的。
在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中没有null / empty搜索方法。 我还检查了是否可以使用MatchAllDocsQuery切换BooleanFilter / TermsFilter。
然而在我的情况下,我的Lucene版本太旧了(2.3.2)我的版本中没有MatchAllDocsQuery,我不希望过滤器的条件影响到lucene的得分。
我在stackoverflow和google中进行了搜索,但是没有哪种情况符合我的情况。
非常感谢任何帮助,感谢阅读。
答案 0 :(得分:0)
我不想回答自己,但我希望我糟糕的解决方案可以帮助/激励那些遇到同样麻烦的人。
在我的情况下,如上所述,我的Lucene版本是如此低版本,许多过滤器受到限制。 但是,我不想使用查询,因为我不希望过滤器影响评分。
所以,我通过“手动”过滤器清除了自己。 我的开发语言是Java,所以我使用了contains方法。
简要介绍我的解决方案,如下所示。
示例:
if (result.contains("KEVIN") ) {
isFilteredResult = true;
} else if (result.contains("JOHN") ) {
isFilteredResult = true;
}
...
我担心这个解决方案,因为这种方式不是Lucene而是Java步骤。所以,我猜想会消耗很多内存。 然而,由于我担心,性能并不差,用户对性能和结果都很满意。
我知道这个解决方案不是好方法,但如果条件如此受限制,这种方式也是一种解决方案。
感谢阅读。 如果有更好的解决方案,请告诉我。