代码之家  ›  专栏  ›  技术社区  ›  samy

搜索、Lucene和条件API:类型不匹配

  •  2
  • samy  · 技术社区  · 17 年前

    我一直在街上到处找 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向查询添加特定的过滤器。所以我做了以下几点:

    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查询对象的类型名称与 EntityOrClassName 财产 标准 对象这就是我的问题所在,因为 FullTextQueryImpl 名称 ,以及 标准 使用 全名 标准 班

    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
    

    结果,比较失败并引发异常。我尝试过使用别名,但没有效果,因为比较没有使用别名。

    在我的全文搜索和CriteriaAPI的混合中,我是否遗漏了一些重要的东西,或者是其他什么东西?它在C#中是否像预期的那样工作,因为我有一种奇怪的感觉,它可能与vb.net有关?

    谢谢你的阅读,

    萨米

    1 回复  |  直到 17 年前
        1
  •  1
  •   Community Mohan Dere    6 年前

    这似乎已通过NHibernate的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/