2011-07-14 39 views
0

私は現在、C#でLuceneライブラリを使用しているプロジェクトに取り組んでいますが、インデックス内のドキュメントの復習に関するプロジェクトのデザインに問題があります。私の索引内の文書はいくつかのフィールドで作成されていますが、これらのフィールドのうちの2つのフィールドの間をフィルタリングしてからこのサブセットを検索することはできますが、まだルーネンに精通しており、 。私は基本的なクエリを実行する方法を学んだが、私はlucenesフィルタクラスを使用する必要があると思うが、私はどのように正確にはわからない。誰もがこのアドバイスを提供できるなら、私は素晴らしいだろうLucene.netで検索するためのフィルタインデックス

私が完了しているプロジェクトは、さまざまな電子メールアカウントからの電子メールメッセージの索引付けを伴います。 アカウント:(例えば[email protected]) フォルダ:(例えば送信され、ゴミ、受信トレイ...) データ:(メール本文)

私のインデックス内のドキュメントは、次のフィールドのいくつかを持っています

インデックスをフィルタリングしたいので、特定のアカウントとフォルダのドキュメントのみを含むサブセットを持つことができます。この後、このサブセットのデータフィールドを検索できるようにしたいと考えています。

+0

あなたは助言 –

+0

あなたがクエリまたはフィルターを意味するかどうかを知ることは有用であろう。クエリはデータの直接参照を行いますが、フィルタを使用してクエリからデータのサブセットを取得します。フィルタが必要なのか、個別の個別の呼び出しを話しているのですか? – dnolan

+1

フィルタを使用する必要はありませんが、BooleanQueryで複数の条件を組み合わせる必要はありません.QueryParserを使用するか、BooleanQueryクラスを使用して手動でクエリを作成しますか? –

答えて

4

@ Jf Beaulacが提案したように、BooleanQueryを使用して「フィルタリング」を行うことができます。ここで

private Query CreateFilteredQuery (string account, string folder, Query criteria) 
{ 
    BooleanQuery bq = new BooleanQuery(); 
    bq.Add(new TermQuery (new Lucene.Net.Index.Term ("account", account)), BooleanClause.Occur.MUST); 
    bq.Add(new TermQuery (new Lucene.Net.Index.Term ("folder", folder)), BooleanClause.Occur.MUST); 
    bq.Add(criteria, BooleanClause.Occur.MUST); 
    return bq; 
} 


Query filteredQuery = CreateFilteredQuery ("[email protected]", "inbox", myQueryParser.Parse (criteria)); 
var hits = myIndexSearcher.Search (filteredQuery); 

は、クエリとフィルタの違いについて良い質問です:あなたが行っている、あなたは上のフィルタを適用したいフィールドのデータが与えに役立つだろうクエリの詳細を与えるWhy do we use Filters while searching

関連する問題