Domanda

Aggiorna

Ho cercato in tutto il NHibernate.Search.Tests progetto per scoprire come viene utilizzata l'API Criteri (trovo estremamente utile per guardarsi intorno il codice di prova per avere esempi di lavoro) e ho notato che il modo di utilizzare la ricerca full-text è radicalmente diversa. Qui ci sono due prove, una con i vincoli di API, uno con lo schema classico di query:

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

La seconda soluzione funziona sotto vb.net , a costo di query Lucene utile (che intraprende il proprio totale delle corrispondenti righe) e al costo dell'ordinamento Lucene (oppure i couldn 't trovare)


Ciao a tutti,

ancora una volta, stumped sul percorso, ma questa volta, ho il sospetto qualcosa di un po 'più sinistro di miei soliti errori erratici ( spunto musica inquietante )

Sto cercando di coniugare FullText ricerca utilizzando Lucene.net con paginazione e l'API Criteri.

paging Finora e la ricerca full-text hanno lavorato in modo impeccabile. Recentemente, però, abbiamo dovuto utilizzare l'API criteri per aggiungere filtri specifici alla query. Quindi quello che ho fatto è stato il seguente:

Crea l'oggetto query Nhibernate.Search utilizzando la seguente

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

quindi aggiungere i miei criteri alla 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)

ma quando ho elencare la query risultante, ricevo la seguente eccezione

Criteri entità query deve corrispondere entità di query

Una rapida occhiata nella FullTextQueryImpl file sorgente (metodo GetLoader ) dimostra che v'è un confronto tra il nome del tipo di dato alla oggetto query NHibernate.Search e la < em> EntityOrClassName di proprietà per le Criteri oggetto. Ecco dove compaiono i miei problemi perché il FullTextQueryImpl utilizza i Nome e Criteri utilizza il Fullname . Ecco un codice di costruttore per la 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

ed ecco il confronto:

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

Di conseguenza, il confronto non riesce e viene generata l'eccezione. Ho provato a giocare con gli alias inutilmente dato che il confronto non utilizza gli alias.

mi sto perdendo qualcosa di enorme nel mio mix di ricerca full-text e l'API criteri, o è qualcos'altro? Funziona come previsto in C #, perché sto avendo una strana sensazione che potrebbe essere correlato vb.net?

Grazie per la lettura,

Samy

È stato utile?

Soluzione

Sembra che questo è stato risolto con la revisione 1611 di NHibernate.Search:

  

Revisione: 1611

     

Messaggio: Corretto un bug in cui un nome di classe completo veniva confrontato con un parziale. Questo stava causando LuceneQueryTest.UsingCriteriaApi al sicuro.

     

modificati: /trunk/src/NHibernate.Search/src/NHibernate.Search/Query/FullTextQueryImpl.cs

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top