Nhibernate.Search, Lucene, e l'API criteri: tipi MISMATCH
-
23-08-2019 - |
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
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 /