Nhibernate 搜索、Lucene和条件API:类型不匹配
更新 我一直在查看NHibernate.Search.Tests项目,以了解CriteriaAPI是如何使用的(我发现查看测试代码以获得工作示例非常有用),并且我注意到使用全文搜索的方式完全不同。以下是两个测试,一个使用criteria API,一个使用经典查询模式:Nhibernate 搜索、Lucene和条件API:类型不匹配,nhibernate,lucene.net,criteria,nhibernate.search,Nhibernate,Lucene.net,Criteria,Nhibernate.search,更新 我一直在查看NHibernate.Search.Tests项目,以了解CriteriaAPI是如何使用的(我发现查看测试代码以获得工作示例非常有用),并且我注意到使用全文搜索的方式完全不同。以下是两个测试,一个使用criteria API,一个使用经典查询模式: [Test] public void ResultSize() { IFullTextSession s = Search.CreateFullTextSession(Ope
[Test]
public void ResultSize()
{
IFullTextSession s = Search.CreateFullTextSession(OpenSession());
ITransaction tx = s.BeginTransaction();
// snipped the objects creation
QueryParser parser = new QueryParser("title", new StopAnalyzer());
Lucene.Net.Search.Query query = parser.Parse("Summary:noword");
IFullTextQuery hibQuery = s.CreateFullTextQuery(query, typeof(Clock), typeof(Book));
Assert.AreEqual(0, hibQuery.ResultSize);
// snipped the end of the test
}
[Test]
public void UsingCriteriaApi()
{
IFullTextSession s = Search.CreateFullTextSession(OpenSession());
ITransaction tx = s.BeginTransaction();
// snipped creation
IList list = s.CreateCriteria(typeof(Clock))
.Add(SearchRestrictions.Query("Brand:seiko"))
.List();
Assert.AreEqual(1, list.Count, "should get result back from query");
// snipped deletion
}
第二个解决方案在vb.net下运行,其代价是有用的Lucene查询(它包含它自己对应行的总数)和Lucene排序(或者我找不到它)
各位好, 再一次,我在这条路上被难住了,但这次,我怀疑有比我通常的不稳定错误(暗示不祥的音乐)更险恶的事情 我正在尝试使用Lucene.net将全文搜索与分页和CriteriaAPI结合起来 到目前为止,分页和全文搜索一直在完美地工作。不过,最近我们不得不使用CriteriaAPI向查询添加特定的过滤器。所以我做了以下几点: 使用以下命令创建Nhibernate.Search查询对象
Private Function GetQuery(ByVal QueryString As String, ByVal Orders() As String) As IFullTextQuery
Dim ifts As IFullTextSession = Search.CreateFullTextSession(UnitOfWork.CurrentSession)
Dim analyzer As New SimpleAnalyzer
Dim parser As New MultiFieldQueryParser(SearchPropertyNames, analyzer)
Dim queryObj As Lucene.Net.Search.Query = parser.Parse(QueryString)
Dim nhsQuery As IFullTextQuery = ifts.CreateFullTextQuery(queryObj, New System.Type() {GetType(T)})
For i As Integer = 0 To Orders.Count - 1
Orders(i) = Orders(i) & "FS"
Next
nhsQuery.SetSort(New Sort(Orders))
然后将我的条件添加到查询:
Dim crit As ICriteria = ifts.CreateCriteria(GetType(T))
Dim criterion As ICriterion
If criteria IsNot Nothing Then
For Each criterion In criteria
If (Not criterion Is Nothing) Then
crit.Add(criterion)
End If
Next
End If
nhsQuery.SetCriteriaQuery(crit)
但是当我列出结果查询时,我收到以下异常
条件查询实体应与查询实体匹配
快速浏览FullTextQueryImpl源文件(方法GetLoader)会发现,为NHibernate.Search查询对象指定的类型名称与Criteria对象的EntityOrClassName属性之间存在比较。这就是我的问题所在,因为FullTextQueryImpl使用名称,而条件使用全名。下面是CriteriaImpl类的构造函数代码
下面是比较:
Dim entityOrClassName As String = DirectCast(Me.criteria, CriteriaImpl).EntityOrClassName
If ((Me.classes.GetLength(0) = 1) AndAlso (Me.classes(0).Name <> entityOrClassName)) Then
Throw New SearchException("Criteria query entity should match query entity")
End If
Dim entityOrClassName As String=DirectCast(Me.criteria,CriteriaImpl).entityOrClassName
如果((Me.classes.GetLength(0)=1)和(Me.classes(0.Name.entityOrClassName)),那么
抛出新的SearchException(“条件查询实体应匹配查询实体”)
如果结束
结果,比较失败并引发异常。我尝试过使用别名,但没有效果,因为比较没有使用别名
在我的全文搜索和CriteriaAPI的混合中,我是否遗漏了一些重要的东西,或者是其他什么东西?它在C#中是否像预期的那样工作,因为我有一种奇怪的感觉,它可能与vb.net有关
谢谢你的阅读
Samy看起来这一问题已通过NHibernate的1611版得到解决。搜索: 修订:1611 消息:修复了将完整类名与部分类名进行比较的错误。这导致LuceneQueryTest.UsingCriteriaApi失败 修改:/trunk/src/NHibernate.Search/src/NHibernate.Search/Query/FullTextQueryImpl.cs
svn:Samy,你在这里解决问题了吗?我遇到了完全相同的问题?我没有进一步挖掘代码;相反,我使用了上面描述的SearchRestrictions.Query方法。它能很好地满足我们的需要。祝你好运,如果你找到了解决方案,请毫不犹豫地在这里发布。谢谢你的提醒。通过使用另一种方法,这个问题变得毫无意义,但很高兴听到这个问题得到了解决:)
Dim entityOrClassName As String = DirectCast(Me.criteria, CriteriaImpl).EntityOrClassName
If ((Me.classes.GetLength(0) = 1) AndAlso (Me.classes(0).Name <> entityOrClassName)) Then
Throw New SearchException("Criteria query entity should match query entity")
End If