2009-08-21 10 views
18

私はインデックス作成と検索サービスのために私のポータル(J2EEベース)でLuceneを使用しています。Luceneのキーワード(OR、AND)検索

問題はLuceneのキーワードです。検索クエリでそれらの1つを使用すると、エラーが発生します。例えば

:それはこれが正常に動作し"ik"または"jij"

searchTerms = "ik AND jij" 

を検索しますので、

searchTerms = "ik OR jij" 

これは、正常に動作し、それが"ik""jij"

を検索しかし、ときに検索:

searchTerms = "OR" 
searchTerms = "AND" 
searchTerms = "ik OR" 
searchTerms = "OR ik" 

等、それはエラーで失敗します:

 
Component Name: STSE_RESULTS Class: org.apache.lucene.queryParser.ParseException Message: Cannot parse 'OR jij': Encountered "OR" at line 1, column 0. 
Was expecting one of: 
... 

これらの言葉は、おそらくLuceneのためのキーワードは予約されているキーワードとして機能するので、それは理にかなっています。

オランダ語では、 "OR"という単語は "Ondernemings Raad"の意味を持つため重要です。それは多くのテキストで使用されており、見つかる必要があります。たとえば "or"は機能しますが、 "OR"という用語に一致するテキストは返されません。検索可能にするにはどうしたらいいですか?

キーワード「または」をエスケープするにはどうすればよいですか?または、どのようにしてLuceneに "または"をキーワードではなく検索語として扱うように指示できますか?

+0

Luceneのどのバージョンですか? AFAIk、BooleanClause.Occur.SHOULDを使用してブーリアンクエリが動作します。 | MUSTNOT(OR | AND | NOT)resp。 – Narayan

+0

Lukeでの検索作業==> http://www.getopt.org/luke/ – Narayan

答えて

-1

検索用語の「OR」をエスケープしたり、別の構文の独自のクエリパーサーを作成したりできます。 Luceneは、独自のクエリ構文を非常に簡単にサポートするパーサに加えて、広範なクエリAPIを提供しています。

+3

どのようにエスケープするのですか? – Areca

0

クエリを作成するときに間違っていると思われます。私は、コメントに掲載されているように、Lukeを取得するためのNarayanの提案を2回目にして、クエリを実行しようとします。私はLuceneを使ってからしばらくしていますが、私はORとANDで問題が発生したことは今まで覚えていません。それ以外

、あなたがQueryParser.escape(userQuery)を使用して、入力文字列をエスケープしてみてください

More On Escaping

+0

エスケープしようとしましたが動作しません。 –

1

私はあなたの質問を何度も読んだことがあります! = [

これらの提案をご覧ください

インデックスはどのように保存されていますか?保存された

文献含むフィールドは、それがLuke使用ください

difference 重要

作ることができる4索引

1)が格納2)トークン化3))ベクトル

として記憶することができますあなたのインデックスがどのように格納されているかを伝えることができます(実際に)

ルークはですはでなければなりません。もしあなたがluceneを使って作業しているのであれば、インデックスがどのように格納されているかを知ることができます。また、検索も提供しています。

4

「OR」を二重引用符で囲んだとします。

これでうまくいかない場合は、Luceneソースを変更してから、すべてのコードを再コンパイルする必要があるかもしれないと思います。演算子「OR」はコードの深い部分に埋め込まれています。実際には、コンパイルするだけでは不十分です。JavaCCの入力として機能するソースパッケージのファイルQueryParser.jjを変更してから、JavaCCを実行してから、すべてを再コンパイルする必要があります。

良いニュースは、しかし、変更する唯一の1行があるということです。

| <OR: ("OR" | "||") >

| <OR: ("||") >

なりそうすれば、あなたは "||" だけ持っています論理OR演算子として。 JavaCCの呼び出しも含まれているbuild.xmlがありますが、自分でthat toolをダウンロードする必要があります。私は今自分でそれを試すことはできません、私は恐れています。

これはおそらくLuceneの開発者メーリングリストのために良い質問ですが、あなたはそれを行うならば、私たちは知っていると、彼らは簡単な解決策を考え出す;-)

2

ORませください。 ANDは予約済みのキーワードです。私はちょうど2日前にユーザーの検索語の3つの単語を小文字にしてluceneクエリパーサに入力する前にこの問題を解決しました。これらのキーワードを検索して置換する場合は、ANDROIDやORDERなどの単語を変更しないように単語境界(\ b)を使用するようにしてください。

は、Googleと同じように - と+を使用してユーザーに指定させます。

3

ORをエスケープし、二重引用符でANDを使用すると効果があります。したがって、Java文字列のように試してみてください

String query = "field:\"AND\"";