友達、
私はLuceneを初めて使用しています...
インデックスの作成、フィールドの追加、検索などに成功しました。
現在、データベースに、どのユーザーがどのドキュメントを表示できるかを示すビューがあります。このビューはいくつかの複雑なルールを使用して作成されているため、ビューを再利用したいと考えています。そのため、Lucene 検索にフィルターを追加して、クエリに一致するがユーザーがアクセスできないドキュメントを削除する必要があります。
私が今やろうとしたことは次
のとおりです。 - dbドキュメントIDをフィールドに保存します。これは Guid です。文字列として保存します。
- 現在のユーザーがアクセスできるすべてのドキュメント ID を取得するカスタム フィルターを作成し、lucene のフィールドを使用してフィルター処理する
効率的ではないと感じています... ユーザーは何十万ものドキュメントにアクセスできるため、フィルター処理が必要な 200,000 ドキュメント ID を取得できます。いくつかのものをキャッシュする必要があると思います...
ここに私が書いたコードがありますが、機能しません:フィルターが使用されたときにドキュメントが返されません(3つのドキュメントが返されるはずです)
public class LuceneAuthorisationFilter : Filter
{
public override DocIdSet GetDocIdSet(Lucene.Net.Index.IndexReader reader)
{
List<Guid> ids = this.load(); // Load list of ID from database
OpenBitSet result = new OpenBitSet(reader.MaxDoc);
int[] docs = new int[1];
int[] freq = new int[1];
for (int i = 0; i < ids.Count; i++)
{
Lucene.Net.Index.TermDocs termDocs = reader.TermDocs(new Lucene.Net.Index.Term("EmId", ids.ElementAt(i).ToString()));
int count = termDocs.Read(docs, freq);
if (count == 1)
{
result.FastSet(docs[0]);
}
}
return result;
}
}
何が悪いのか分かりますか?そして、どのようにパフォーマンスを向上させますか?
ありがとうございました
編集:
上記のコードは機能しますが、問題は EmId フィールドがインデックス化されていないことだけでした。今、私は変わりました、そしてそれはうまくいきます。
今、私はパフォーマンスを向上させるためのヒントがあればいいのにと思います
フィードバックを追加するための 2 回目の編集
注: テスト環境には 25,000 のドキュメントが含まれており、ドキュメント アクセスのリストには 50,000 の ID が含まれています (すべてのドキュメントがまだ公開されていないため)。
インデックス付き)
- 上記のカスタム フィルターを使用: フィルターがキャッシュされるため、初回は ~2600 ミリ秒、次回は 2100 ミリ秒
- ブールクエリフィルターを使用: ~4700ms から ~4000ms
これらはパフォーマンスが悪いです...そこで、見つかった「FieldCacheTermsFilter」フィルターを再度検索しました。
- FieldCacheTermFilter の使用: ~600ms から ~60ms
これは許容できるパフォーマンスです
PS:別の同様の質問も見つけました