NHibernateプロジェクトに実装しているLuceneFTエンジンがあります。私がやろうとしていることの1つは、定期的なメンテナンスをサポートすることです。つまり、FTインデックスをクリーンアップし、永続化されたエンティティから再構築します。PopulateIndex<T>
エンティティのタイプを導出し、フルテキストのインデックス付き列のプロパティ属性を検索して、それらをLuceneディレクトリに格納できるジェネリック静的メソッドを作成しました。IEnumerable<T>
今の私の問題は、NHibernate側から強く型付けされたメソッドをどのように提供するかです。
public static void PopulateIndex<T>(IEnumerable<T> entities) where T : class
{
var entityType = typeof(T);
if (!IsIndexable(entityType)) return;
var entityName = entityType.Name;
var entityIdName = string.Format("{0}Id", entityName);
var indexables = GetIndexableProperties(entityType);
Logger.Info(i => i("Populating the Full-text index with values from the {0} entity...", entityName));
using (var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30))
using (var writer = new IndexWriter(FullTextDirectory.FullSearchDirectory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED))
{
foreach (var entity in entities)
{
var entityIdValue = entityType.GetProperty(entityIdName).GetValue(entity).ToString();
var doc = CreateDocument(entity, entityIdName, entityIdValue, indexables);
writer.AddDocument(doc);
}
}
Logger.Info(i => i("Index population of {0} is complete.", entityName));
}
これは私にagitaを与えている方法です:
public void RebuildIndices()
{
Logger.Info(i => i("Rebuilding the Full-Text indices..."));
var entityTypes = GetIndexableTypes();
if (entityTypes.Count() == 0) return;
FullText.ClearIndices();
foreach (var entityType in entityTypes)
{
FullText.PopulateIndex(
_Session.CreateCriteria(entityType)
.List()
);
}
}
これは強い型を返すように見えますList<T>
が、そうではありません。どうすればその強く型付けされたリストを取得できますか、またはこれを行うための代替/より良い方法はありますか?