views:

614

answers:

0

Update

I've been looking around the NHibernate.Search.Tests project to find out how the Criteria API is used (i find it immensely useful to look around the test code to have working examples) and i noticed that the way to use the Fulltext search is radically different. Here are two tests, one with the criteria API, one with the classic query schema:

[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
        }

The second solution works under vb.net, at the cost of the useful Lucene query (which embarks it's own total of the corresponding rows) and at the cost of the Lucene ordering (or i couldn't find it)


Hello everyone,

yet again, i'm stumped on the path, but this time, i suspect something a bit more sinister than my usual erratic errors (cue ominous music)

I'm trying to combine FullText search using Lucene.net with paging and the Criteria API.

So far paging and the Fulltext search have been working flawlessly. Recently though, we had to use the criteria API to add specific filters to the query. So what i did was the following:

Create the Nhibernate.Search query object using the following

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))

then add my Criteria to the query:

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)

but when i list the resulting query, i receive the following exception

Criteria query entity should match query entity

A quick glance in the FullTextQueryImpl source file (method GetLoader) shows that there is a comparison between the type name given to the NHibernate.Search query object and the EntityOrClassName property for the Criteria object. That's where my problems appear because the FullTextQueryImpl uses the Name, and the Criteria uses the Fullname. Here's a constructor code for the CriteriaImpl class

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

and here's the comparison:

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

As a result, the comparison fails and the exception is thrown. I tried playing around with the aliases to no avail since the comparison is not using the aliases.

Am i missing something huge in my mix of the Fulltext search and the Criteria API, or is it something else? Does it work as expected in C#, because i'm having a weird feeling that it could be vb.net related?

Thank you for reading,

Samy