【问题标题】:Polymorphic queries with NHibernate Search使用 NHibernate Search 进行多态查询
【发布时间】:2012-02-07 12:53:53
【问题描述】:

我在单个 NHibernate 搜索索引中存储了多个实体,希望能够一次查询所有实体。用例是一个返回混合结果的简单搜索页面。因此,例如,代码可能如下所示:

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 实现类似于多态查询的最简单方法是什么?

【问题讨论】:

    标签: .net nhibernate lucene lucene.net nhibernate-search


    【解决方案1】:

    存在CreateFullTextQuery 的重载,允许您指定要搜索的类型:

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2012-04-23
      • 1970-01-01
      • 2022-10-04
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多