2012-04-26 10 views
5

私が "state:OR"というクエリで渡したとき、luceneは "OR"をブール値節のキーワード とみなしてエラーを出しましたが、ここで私は実際にオレゴン州の略語を使います。luceneクエリでORとANDを正しくエスケープする方法は?

私はORを引用しているので、クエリは「状態:」になります。「OR」は動作します。

しかし、私はluceneが使用するキーワードのそれぞれに対して文字列置換を行わなければならないので、非常に良いアプローチのようには聞こえません。私は何度もしません

私はqueryParser.parse()を実行するのではなく、クエリを直接構築しようとしましたが、これはアナライザを通過しないように見えますが、これは大きな問題です。

+0

クエリを手動で作成する前にこの用語を分析することができます – jpountz

答えて

3

Lucene query syntaxにはAND、OR、NOTの3つのスタンドアロンキーワードしかありません。 ( "TO"も使用されますが、範囲クエリ内でのみ認識されます)

引用符は、アプリケーションの用語として実際に使用されるLuceneキーワードを認識する必要がありますあなたの例では上記)。

4

はこれを逃れるために、いくつかの方法がありますが、クリーナーは脱出することであるAND、OR、&しないで有数のバックスラッシュ例えば:

\\AND \\OR \\NOT

交互に、コードのパーサはその小文字の同等の解析を行いませんオペレータとして

+0

私はこのようなことをしていましたので、この 'searchTerm.replaceAll(" \\ b(AND | OR | NOT)\\ b "、" \\\\\ \\\ $ 1 ");'ユーザが入力した検索ボックスで使用されるリテラルをエスケープし、最終的にはsolrクエリで終わる - w私が見つけた帽子は、もはや解析例外は存在しませんが、リテラル文字列を実際には検索しないという点で、\\をあらかじめ保留してANDをエスケープしていました。 Solrの発言では、名前が "Jim and john"のエントリを返す必要がある場合、クエリーのパラメータ 'name:\\ AND'は結果を検出しません。小文字は、少なくともsolrに行く方法かもしれません! – icyitscold

関連する問題