2

更新

我一直在查看NHibernate.Search.Tests项目以了解如何使用 Criteria API(我发现查看测试代码以获取工作示例非常有用)并且我注意到使用全文搜索的方式完全不同。这里有两个测试,一个使用条件 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的全文搜索与分页和 Criteria API 结合起来。

到目前为止,分页和全文搜索工作完美无缺。不过最近,我们不得不使用条件 API 向查询中添加特定的过滤器。所以我做的是以下内容:

使用以下命令创建 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使用Name,而Criteria使用Fullname这是CriteriaImpl类的构造函数代码

Public Sub New(ByVal persistentClass As Type, ByVal session As ISessionImplementor)
    Me.New(persistentClass.FullName, CriteriaSpecification.RootAlias, session)
    Me.persistentClass = persistentClass
End Sub

这是比较:

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

结果,比较失败并抛出异常。我尝试使用别名无济于事,因为比较没有使用别名。

在全文搜索和 Criteria API 的组合中,我是否遗漏了一些巨大的东西,还是其他东西?它在 C# 中是否按预期工作,因为我有一种奇怪的感觉,它可能与 vb.net 相关?

感谢您的阅读,

萨米

4

1 回答 1

1

看起来这已通过 NHibernate.Search 的修订版 1611 解决:

修订:1611

消息:修复了将完整类名与部分类名进行比较的错误。这导致 LuceneQueryTest.UsingCriteriaApi 失败。

修改:/trunk/src/NHibernate.Search/src/NHibernate.Search/Query/FullTextQueryImpl.cs

svn:https ://nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunk/src/NHibernate.Search/

于 2011-05-05T18:41:43.030 回答