2

複数のエンティティを 1 つの NHibernate Search インデックスに格納して、それらすべてを一度にクエリできることを期待しています。ユースケースは、混合結果を返す単純な検索ページです。たとえば、コードは次のようになります。

public interface ISearchable {}

[Indexed(Index = "TheIndex")]
public class SearchableEntityA : ISearchable
{
    // Some [Field]s
}

[Indexed(Index = "TheIndex")]
public class SearchableEntityB : ISearchable
{
    // Some other [Field]s
}

これはすべてインデックスに問題なく、もちろん生の NHibernate で次のようにクエリ可能です。

session.CreateCriteria<ISearchable>().List<ISearchable>();

ISearchable にいくつかのフィールドがありますが、これらは NHibernate マッピングで特に参照されていません。

私の希望は、私がただ言うことができるということでした:

var query = "some keyword";
fullTextSession.CreateFullTextQuery<ISearchable>(query).List<ISearchable>();

そして、さまざまなエンティティからの結果を含む ISearchables のリストを取得します。しかし、現実にはNHibernate.HibernateException: Not a mapped entity: NetComposites.Model.ISearchable.

では、NHibernate Search を使用してポリモーフィック クエリに似たものを実現する最も簡単な方法は何でしょうか?

4

1 に答える 1

2

CreateFullTextQuery検索する型を指定できる existsのオーバーロード:

fullTextSession.CreateFullTextQuery(query, typeof(EntityA), typeof(EntityB)).List<ISearchable>();

すべてのタイプを指定するのは少し面倒ですが、問題なくロードされます。私が抱えている唯一の問題は、デフォルトですべてのフィールド検索を実行できるという私の仮定が間違っていたため、MultiFieldQueryParser検索可能なすべてのエンティティのすべてのプロパティを構築する必要があることです。

private static Query ParseQuery(string query, IFullTextSession searchSession)
{
    var parser = new MultiFieldQueryParser(GetAllFieldNames(searchSession), new StandardAnalyzer());
    return parser.Parse(query);
}

private static string[] GetAllFieldNames(IFullTextSession searchSession)
{
    var reader =
        searchSession.SearchFactory.ReaderProvider.OpenReader(
            searchSession.SearchFactory.GetDirectoryProviders(typeof (Company)));
    var fieldNames = reader.GetFieldNames(IndexReader.FieldOption.ALL);
    return fieldNames.Cast<string>().ToArray();
}
于 2012-02-08T13:04:27.803 に答える