Frage

Aktualisieren

Ich habe geschaut, um die NHibernate.Search.Tests Projekt, um herauszufinden, wie die Kriterien API verwendet wird (ich finde es ungemein nützlich um den Testcode zu sehen Arbeitsbeispiele haben) und ich bemerkte, dass die Art und Weise die Volltextsuche zu verwenden, radikal unterscheidet. Hier sind zwei Tests, eine mit dem Kriterien-API, eine mit dem klassischen Abfrageschema:

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

Die zweite Lösung arbeitet unter vb.net , auf Kosten der nützlichen Lucene Abfrage und auf Kosten der Lucene Ordnung (die eine eigene Summe der entsprechenden Zeilen schifft) (oder i couldn ‚t es finden)


Hallo an alle,

noch einmal, ich bin auf dem Weg stapfe, aber dieses Mal, vermute ich etwas ein bisschen unheimlich, als meine üblichen erratischen Fehler ( Cue ominöse Musik )

Ich versuche, die Volltextsuche mit Lucene.net mit Paging und den Kriterien API zu verbinden.

Bisher Paging und die Volltextsuche fehlerlos gearbeitet haben. Vor kurzem jedoch hatten wir die Kriterien API verwenden, um bestimmte Filter auf die Abfrage hinzuzufügen. Also, was ich tat, war die folgende:

Erstellen Sie das Nhibernate.Search Query-Objekt mit dem folgenden

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

dann meine Kriterien für die Abfrage hinzufügen:

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)

aber wenn ich die resultierende Abfrage aufzulisten, erhalte ich die folgende Ausnahme

Kriterien Abfrage Einheit sollte Abfrage Entität übereinstimmen

Ein kurzer Blick in der FullTextQueryImpl Quelldatei (Methode GetLoader ) zeigt, dass es ein Vergleich zwischen dem Typnamen auf das NHibernate.Search Abfrageobjekt und dem gegebenen < em> EntityOrClassName Eigenschaft für die Kriterien Objekt. Das ist, wo meine Probleme auftreten, weil die FullTextQueryImpl verwendet die Name und Kriterien verwendet die Vollständiger Name . Hier ist ein Konstruktor-Code für die CriteriaImpl Klasse

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

und hier ist der Vergleich:

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

Als Ergebnis schlägt der Vergleich und die Ausnahme ausgelöst wird. Ich habe versucht, mit den Aliasnamen ohne Erfolg herumspielen, da der Vergleich ist nicht die Aliase verwenden.

Fehle ich etwas Großes in meinem Mix aus Volltext-Suche und die Kriterien API, oder ist es etwas anderes? Ist es in C # wie erwartet, weil ich ein seltsames Gefühl habe, dass es vb.net zusammenhängen könnte?

Danke für das Lesen,

Samy

War es hilfreich?

Lösung

Sieht aus wie diese hat mit der Revision 1611 von NHibernate.Search gelöst:

  

Revision: 1611

     

Nachricht: Ein Fehler wurde behoben, bei dem eine vollständige Klassenname gegen eine teilweise verglichen wurde. Dies verursacht wurde LuceneQueryTest.UsingCriteriaApi zum Scheitern verurteilt.

     

Geändert: /trunk/src/NHibernate.Search/src/NHibernate.Search/Query/FullTextQueryImpl.cs

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top