如何添加Lucene过滤器作为动态条件?

时间:2017-08-25 08:21:56

标签: filter 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中没有null / empty搜索方法。 我还检查了是否可以使用MatchAllDocsQuery切换BooleanFilter / TermsFilter。

然而在我的情况下,我的Lucene版本太旧了(2.3.2)我的版本中没有MatchAllDocsQuery,我不希望过滤器的条件影响到lucene的得分。

我在stackoverflow和google中进行了搜索,但是没有哪种情况符合我的情况。

非常感谢任何帮助,感谢阅读。

1 个答案:

答案 0 :(得分:0)

我不想回答自己,但我希望我糟糕的解决方案可以帮助/激励那些遇到同样麻烦的人。

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

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

简要介绍我的解决方案,如下所示。

  1. 使用AS-IS方法搜索Lucene。
  2. 在结果中,与contains方法进行比较(我添加了此步骤。)
  3. 示例:

    if (result.contains("KEVIN") ) {
     isFilteredResult = true;
    } else if (result.contains("JOHN") ) {
     isFilteredResult = true;
    }
    ...
    
    1. 显示包含条件关键字的唯一结果。
    2. 我担心这个解决方案,因为这种方式不是Lucene而是Java步骤。所以,我猜想会消耗很多内存。 然而,由于我担心,性能并不差,用户对性能和结果都很满意。

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

      感谢阅读。 如果有更好的解决方案,请告诉我。