Nhibernate 搜索、Lucene和条件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

更新

我一直在查看NHibernate.Search.Tests项目,以了解CriteriaAPI是如何使用的(我发现查看测试代码以获得工作示例非常有用),并且我注意到使用全文搜索的方式完全不同。以下是两个测试,一个使用criteria API,一个使用经典查询模式:

[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