2011-06-23 7 views
3

私はいくつかのフィールドを検索しようとしていますが、用語 "BE"を使用しないと正常に動作します。この場合、luceneは単にフィールドを無視します。下に示すようなことをすれば正しい結果が得られ、 "照会"オブジェクトは "+ flag:bf + type:cgo"として表示されます。フラグまたはタイプ用語のいずれかを「BE」に設定すると、検索の一部は無視されます。 たとえば、queryStringを "flag:\" BE \ "AND type:\" CGO \ ""に設定した場合、クエリオブジェクトは "+ type:cgo"として表示され、より多くのヒットが得られます。 "type"にも同じことが起こります - 最後の例の "CGO"を "BE"に変更すると無視されます。私は可能なすべての2つの文字の組み合わせを試していない(しかし、私は多くを試してみました)が、このすべてを除いて期待どおりに動作します。私はストップタームを使用していません。Lucene QueryParserは検索用語 "BE"を無視します

おかげで、あなたがしようとしていない可能性がありますが、あなたは確かに、ストップワードを使用している

String queryString = "flag:\"BF\" AND type:\"CGO\""; 
QueryParser qp = new QueryParser(Version.LUCENE_30, 
        "type", new StandardAnalyzer(Version.LUCENE_30)); 

Query query = qp.parse(queryString); 
IndexSearcher searcher = new IndexSearcher(reader.reopen()); 
TopDocs td = searcher.search(q, 5000); 
logger.info("Found " + td.totalHits + " hits using " + query.toString()); 

答えて

4

デフォルトでは、StandardAnalyzerはストップワードのセットを使用して、テキストのインデックス付き用語から「ノイズ」を除外します。スタンダードアナライザーの文脈では、 "BE"は通常はストップワードと見なされると思います。

幸いにも、あなたが

明白なものが使用StandardAnalyzerのコンストラクタにストップワードの空のセットを通過させることであるが利用可能ないくつかの選択肢を持っています。

ただし、フィールドの名前(「フラグ」と「タイプ」)を見ると、文字列は単純ではなく、コードワードを含む可能性が高くなります。そのことを念頭に置いて、キーワードアナライザーが適しているかもしれません。

幸運、

+0

ありがとうございます。標準アナライザーではなくキーワードアナライザーを使用することで、この問題が解決されました。 –

1

ジーン:「こと」が含ま

QueryParser qp = new QueryParser(Version.LUCENE_30, 
       "type", new StandardAnalyzer(Version.LUCENE_30)); 

StandardAnalyzerがストップワードデフォルトでは、標準的な英語を使用して、 。

+0

はい、あなたは正しいです。スタンダード・アナライザが作成していたときにストップ・ワードを使用していたことはわかりませんでした。代わりにキーワードアナライザを使用して修正しました。ありがとう。 –

関連する問題