标签: nhibernate.search

NHibernate Linq Query比HQL慢3倍

我有一个简单的测试,运行查询5000次.查询的linq版本占用HQL的3倍,缓存的Linq版本比HQL的缓存版本慢得多

HQL:

session.CreateQuery(String.Format("from Episode where SeriesId='{0}' and SeasonNumber='{1}' and EpisodeNumber='{2}'", seriesId, seasonNumber, episodeNumber))
               .SetMaxResults(1)
               .SetCacheable(true)
               .UniqueResult<Episode>();
Run Code Online (Sandbox Code Playgroud)

LINQ:

session.Query<Episode>()
       .Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber && c.EpisodeNumber == episodeNumber)
       .Cacheable()
       .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

结果如下

HQL:   Cached: less than a second   No-Cache: 5 seconds
LINQ:  Cached: 8 seconds            No-Cache: 15 seconds

我只是想确保我遇到了预期的开销,而不是我做错了什么.

如果那个头顶在那里并且我可以做的不多,你能否建议一个中间地带,这将需要更少的字符串,但提供更好的性能?

注意:我在Fluent Nhibernate中的缓存设置 .Cache(c => c.UseQueryCache().UseSecondLevelCache().UseMinimalPuts().ProviderClass<HashtableCacheProvider>())

.net nhibernate hql nhibernate.search linq-to-nhibernate

14
推荐指数
1
解决办法
2423
查看次数

未配置ProxyFactoryFactory

将此示例视为基本示例,我创建了应用程序,但是当我执行此应用程序时,我收到以下错误.

未配置ProxyFactoryFactory.使用一个可用的NHibernate.ByteCode提供程序初始化session-factory配置节的'proxyfactory.factory_class'属性.示例:NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate.ByteCode.LinFu示例:NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle

以下是我正在使用的代码段.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using NHibernate;
using NHibernate.Cfg;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Configuration cfg = new Configuration();
        cfg.AddAssembly("NHibernate");

        ISessionFactory factory = cfg.BuildSessionFactory();
        ISession session = factory.OpenSession();
        ITransaction transaction = session.BeginTransaction();
        User newUser = new User();
        newUser.Id = "joe_cool";
        newUser.UserName = "Joseph Cool";
        newUser.Password = "abc123";
        newUser.EmailAddress = "joe@cool.com";
        newUser.LastLogon = DateTime.Now;

        // Tell NHibernate that this object should be …
Run Code Online (Sandbox Code Playgroud)

asp.net nhibernate nhibernate-mapping nhibernate.search proxyfactory

11
推荐指数
2
解决办法
2万
查看次数

8
推荐指数
1
解决办法
869
查看次数

Lucene.NET搜索突出显示尊重HTML标签

我试图在一个HTML块中突出显示搜索词,问题是如果用户搜索"颜色",这个:

<span style ='color:white'>白色</ span>

成为:<span style =' <b>颜色</ b>:白色'> <b>白色</ b> </ span>

显然,弄乱我的风格并不是一个好主意.

这是我正在使用的代码:

        Query parsedQuery = parser.Parse(luceneQuery);
        StandardAnalyzer Analyzer = new StandardAnalyzer();
        SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<b class='search'>", "</b>");

        QueryScorer scorer = new QueryScorer(parsedQuery);
        Highlighter highlighter = new Highlighter(formatter, scorer);

        highlighter.SetTextFragmenter(new SimpleFragmenter());
        Highlighter.GetBestFragment(Analyzer, propertyName, invocation.ReturnValue.ToString())
Run Code Online (Sandbox Code Playgroud)

我猜这个问题是我需要一个不同的Fragmenter,但我不确定.任何帮助,将不胜感激.

lucene.net nhibernate.search

8
推荐指数
1
解决办法
1203
查看次数

使用Nhibernate急切加载树/层次结构

这不是一个问题,我过去几天一直在研究这个问题,并且认为我想贡献一些东西,这些东西吸引了我一直在阅读的许多不同的想法,并提出了我的解决方案.问题...

问题是在Nhibernate中急切加载n级子对象并且nHibernate不知道树的深度.我已经看到通过使用直接sql和Union All解决了这个问题,但不幸的是我无法让它工作,通常是因为nhibernate不知道你渴望加载对象.所以我查看了以下代码,以便使用条件急切加载对象

        var children = Session.CreateCriteria<MenuNode>()
            .SetFetchMode("Children", FetchMode.Eager)
            .Add(Expression.Eq("Id", 1))
            .List<MenuNode>();
Run Code Online (Sandbox Code Playgroud)

这将为Id 1加载孩子,从这里你可以使用In语句一次加载多个实体.所以我只需要计算出属于这个层次结构的所有节点id,并使用In语句急切加载它.

因此,如果我为层次结构创建一个父表,并且每个节点都有一个层次结构ID,那么我可以使用此hql获取此层次结构的所有节点标识的列表

var sql = "select Distinct id from Nodes where (HierarchyId = :id) ";
var ids = Session.CreateSQLQuery(sql)
          .SetInt32("id", id)
          .List();
Run Code Online (Sandbox Code Playgroud)

并从这里急切地加载所有孩子为这棵树单独使用

var children = Session.CreateCriteria<MenuNode>()
            .SetFetchMode("Children", FetchMode.Eager)
            .Add(Expression.In("Id", ids))
            .List<MenuNode>();
Run Code Online (Sandbox Code Playgroud)

唯一的问题是你没有急切地从层次结构父表中加载第一级节点,这可以正常完成.

var menu = Session.CreateCriteria<Menu>()
            .SetFetchMode("RootNodes", FetchMode.Eager)
            .Add(Expression.Eq("Id", id))
            .List<Menu>();
Run Code Online (Sandbox Code Playgroud)

就这样,在三个SQL语句中,您已经将一个子对象急切地加载到n个级别.为了进一步优化,我使用多查询将两个主要查询链接在一起并同时发送两个语句.为了回退id而需要独立执行以撤回id的声明.

有关使用MultiCriteria进行预加载的更多详细信息,请点击此处.

http://nhforge.org/blogs/nhibernate/archive/2008/09/06/eager-loading-aggregate-with-many-child-collections.aspx

希望这对某人有所帮助

nhibernate nhibernate.search

6
推荐指数
1
解决办法
2046
查看次数

流利的NHibernate + Lucene搜索(NHibernate.Search)

我正在使用Fluent NHibernate,我想用Lucene实现NHibernate.Search但是我找不到任何关于如何用Fluent NHibernate做这个的例子.看来有两个步骤.(根据城堡)

  1. 在配置中设置Hibernate属性:

    • hibernate.search.default.directory_provider
    • hibernate.search.default.indexBase
    • hibernate.search.analyzer
  2. 初始化事件侦听器以索引持久化对象

    • configuration.SetListener(ListenerType.PostUpdate,new FullTextIndexEventListener());
    • configuration.SetListener(ListenerType.PostInsert,new FullTextIndexEventListener());
    • configuration.SetListener(ListenerType.PostDelete,new FullTextIndexEventListener());

我想出了如何向Fluent NHibernate源配置添加属性,但我无法找到事件监听器的设置位置.

lucene nhibernate event-listener fluent-nhibernate nhibernate.search

3
推荐指数
1
解决办法
3814
查看次数

将Nhibernate.Search与Nhibernate 2集成

我花了一整天的时间试图让NHibernate.Search和NHibernate 2.0一起工作,很遗憾地说我还没有管理它.我遇到了这里发布的问题并下载了该帖子链接的dll,但是这个例子使用的是搜索拦截器而不是EventListeners,我相信这是更新的做事方式.似乎很少有可用的信息,我能找到的信息很难理解,并且与其他信息相矛盾.

在这一点上,我对整个事情感到非常沮丧,我正在认真考虑编写自己的Nhibernate和Lucene(或者可能是另一个索引库)的集成.目前似乎NHibernate.Search现在已经足够成熟,我可以考虑使用它,我会更舒服地维护我自己的更简化的库.

我想知道的是,是否有一种明确的方法可以将NHibernate.Search与NHibernate 2一起使用,以及在生产环境中使用它是否可行.

nhibernate nhibernate.search

3
推荐指数
1
解决办法
2153
查看次数

未映射Id时,按Id列表加载实体的正确方法

我有以下代码

string idName = builder.IdentifierName;
Disjunction disjunction = Restrictions.Disjunction();
IList ids = new ArrayList(entityInfos.Length);
foreach (var entityInfo in entityInfos)
{
    ids.Add(entityInfo .Id);
}
disjunction.Add(Restrictions.In(idName, ids));
criteria.Add(disjunction);
criteria.List();
Run Code Online (Sandbox Code Playgroud)

(我还没写过,它是来自NHibernate.Search的简化代码)

idName是正确的("Id").

在我的映射中,我没有将Id映射到实体属性,它只是DB:

<id column="Id" type="int">
  <generator class="native" />
</id>
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,它会抛出异常:

[QueryException: could not resolve property: Id of: MyType]
   NHibernate.Persister.Entity.AbstractPropertyMapping.ToType(String propertyName) +326
   NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetTypeUsingProjection(ICriteria subcriteria, String propertyName) +416
   NHibernate.Criterion.InExpression.AssertPropertyIsNotCollection(ICriteriaQuery criteriaQuery, ICriteria criteria) +41
   NHibernate.Criterion.InExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +49
   NHibernate.Criterion.Junction.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +448
   NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary`2 enabledFilters) +354 …
Run Code Online (Sandbox Code Playgroud)

nhibernate criteria nhibernate-mapping nhibernate.search

0
推荐指数
1
解决办法
1695
查看次数