2017-08-25 7 views
0

まず、私の質問のタイトルはあいまいですが、私は言い方が分かりません。あなたは私の例を見ると分かります。動的条件としてLuceneフィルタを追加するには?

SQLクエリでは、 '1 = 1'の動的条件を適用できます。

例を挙げておきます。

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

上記のように、以下のようなフィルタを適用します。私が知っているようにLuceneのにはヌル/空の検索方法がないので

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 

しかし、私は予想通りの結果が一致していない。(無安打)

は、それはです。 また、BooleanFilter/TermsFilterをMatchAllDocsQueryに切り替えることができるかどうかを確認しました。

私のケースでは、私のLuceneバージョンは古く(2.3.2)、私のバージョンではMatchAllDocsQueryが存在しないため、フィルターの条件がluceneの得点に影響しないようにしたいと思います。

私はstackoverflowとgoogleで検索しましたが、私の状況に一致するケースはありません。

ご協力いただければ幸いです。読んでいただきありがとうございます。

+0

これは確かにかなり古いですが、チェックするためにソースをダウンロードしなければなりませんでしたが、実際には2.3.2の 'MatchAllDocsQuery'があります。 – femtoRgon

+0

@femtoRgonコメントありがとうございました。あなたのコメントのおかげで、私はMatchAllDocsQueryがあることを発見しました。しかし、可能であれば、MatchAllDocsQueryを使用するのではなく、フィルターを使用したいのですが、フィルターはLuceneのスコアリングに影響するため、フィルターは使用しません。 – TwilighT

答えて

0

私は自分自身に答えたくはありませんでしたが、私の貧しい解決策が同じ問題を抱えている人を助けたり鼓舞したりすることを願っています。

私の場合、上記のように、私のLuceneバージョンは非常に低いバージョンであり、多くのフィルタが制限されています。 しかし、フィルターをスコアリングに影響させたくないので、私は照会を使用したくありませんでした。

私は自分で「手動」フィルタをクリアしました。 私の開発言語はJavaだったので、メソッドを含んでいました。

下記のように私の解決策を説明してください。

  1. Lucene AS-IS法で検索してください。
  2. 結果内で、と比較する方法(私はこのステップを追加しました。)

例含ま:

if (result.contains("KEVIN")) { 
isFilteredResult = true; 
} else if (result.contains("JOHN")) { 
isFilteredResult = true; 
} 
... 
条件のキーワードが含ま
  • 結果のみが表示され、

    私はこの方法がLuceneではなくJavaのステップで行われるため、この解決策が心配でした。だから、あまりにも多くのメモリが消費されると思った。 しかし、私が心配していたので、パフォーマンスは悪くないし、ユーザーはパフォーマンスと結果の両方に満足している。

    私はこの解決策が良い方法ではないことを知っていますが、条件が非常に制限されている場合、この方法も解決策になります。

    読んでいただきありがとうございます。 もっと良い解決策があれば教えてください。

  • 関連する問題