2011-06-23 9 views
1

ブールクエリLucene.net(バージョン2.9)で複数のクエリを組み合わせると問題が発生します。Lucene.net(バージョン2.9)のブールクエリと複数のクエリを組み合わせたときの問題

私が索引付けした文書構造を参照してください。

ID Make  Model  Price MakeDate CreatedBy 
1 Ford  Fiesta 240000 06/23/2011 anil 
2 Ford  Focus  250000 06/20/2011 anil 
3 Vauxhall Astra  200000 06/21/2011 anil 
4 Ford  Focus LX 230000 06/21/2011 anilkumar 
5 Ford  Focus XI 260000 06/20/2011 anil 

私の意図は、フィールドすなわちモデルのいずれかでfocusが含まれているか確認します..フィールドとCreatedByAnilに等しいのレコードを取得することです。

このため、次のクエリを書いています。

WildcardQuery query4 = new WildcardQuery(new Term("Make", "*focus*")); 
WildcardQuery query5 = new WildcardQuery(new Term("Model", "*focus*")); 

var queryParser3 = new QueryParser(Version.LUCENE_29, "CreatedBy", analyzer1); 
var query3 = queryParser3.Parse("anil"); 

objBool.Add(query3, BooleanClause.Occur.MUST); 
objBool.Add(query4, BooleanClause.Occur.SHOULD); 
objBool.Add(query5, BooleanClause.Occur.SHOULD); 

これを実行すると、実際には2番目と5番目の2つのレコードのみを取得する必要があります。しかし、私は4回目以外の4回目のレコードを取得しています。

CreatedByのすべてのレコードを返すことは、Anilと同じです。

必要な結果を得る方法と、変更が必要なことを教えてください。

+0

スコアリングのない検索では、同じBooleanQueryのMUSTとSHOULD句を持つ必要はありません。文書に 'cat'が含まれていてSHOULDに 'dog'が含まれていなければならない場合、SHOULD句は余分なものです。しかし、クエリがスコアリングを行う場合、SHOULD句を増やすには、MUST句を含むSHOULD句を含めることができます。だから、「猫」を持っていなければならないすべての文書を検索することができますが、「犬」もある文書もスコアを上げることができます。 – Jegschemesch

答えて

0

queryParser.Parse(「+モデル:フォーカス+ CREATEDBY:アニル」)

+0

これは、ModelフィールドとCreatedByでstricklyをチェックするときに機能します。しかし、ModelとMakeフィールドにはcontainsを、CreatedByフィールドにはEqualを適用したい。ちょうど(Model = '* focus *' OR Make = '* focus *')そしてCreatedBy = 'Anil'のように。 –

3

あなたが巣に必要なクエリ、あなたには、いくつかのブラケットで擬似コードで自分の文を書いた場合、それはより理にかなって、何」実際にやろうとすることであるRE:

CreatedBy=='anil' AND (make~='*focus*' OR mode~='*focus*') 

あなたのコードで行うために必要なものはMUSTクエリで2つのSHOULDクエリ巣にで追加のステップを追加することです。

例:

objBool.Add(query3, BooleanClause.Occur.MUST); 
objBool.Add(query4, BooleanClause.Occur.SHOULD); 
objBool.Add(query5, BooleanClause.Occur.SHOULD); 

なる:

objBool.Add(query3, BooleanClause.Occur.MUST); 

BooleanQuery nested = new BooleanQuery(); 
nested.Add(query4, BooleanClause.Occur.SHOULD); 
nested.Add(query5, BooleanClause.Occur.SHOULD); 

objBool.Add(nested, BooleanClause.Occur.MUST); 

考慮すべき他の事は、Luceneのがデータベースではないということです、それはMakeModelあなたのインデックスと呼ばれる列を作成するために完全に有効ですメイクとモデルの両方を含むコンテンツであれば、よりシンプルで高速なクエリを作成できます。 Luceneでは、索引を構築することは、問合せを構成することと同じくらい重要です。

+0

ありがとうございました。はい、私の作品と複数のフィールドで複数の条件を使用する方法のアイデアを得ました。もう一度ありがとう... –

関連する問題