UpdateNhibernate.Search, Lucene и критерии API: типы рассогласования
Я смотрел вокруг NHibernate.Search.Tests проект, чтобы узнать, как используется критерии API (я найти очень полезно посмотреть вокруг тестового кода на рабочие примеры), и я заметил, что способ использования полнотекстового поиска радикально отличается. Вот два теста, один с критериями 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 (или я не мог найти его)
Привет всем,
еще раз, я уверен, тупик на пути, но на этот раз , я подозреваю что-то немного больше siniste г, чем мои обычные неустойчивые ошибки (кий зловещая музыка)
Я пытаюсь совместить полнотекстовый поиск с использованием Lucene.Net с пейджинговой и Criteria API.
Пока пейджинг и поиск в полнотекстовом режиме работают безупречно. Недавно, однако, нам пришлось использовать API критериев для добавления в запрос определенных фильтров. Так что я сделал следующее:
Создать объект запроса Nhibernate.Search с помощью следующей
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 использует имя, и Критерии использует Ф.И.О. Вот конструктор код CriteriaImpl класса
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
В результате, сравнение неуспешно и исключение. Я пытался играть с псевдонимами безрезультатно, потому что сравнение не использует псевдонимы.
Я пропустил что-то огромное в моем миксе поиска по Fulltext и API критериев, или это что-то еще? Работает ли он так, как ожидалось, на C#, потому что у меня странное ощущение, что это может быть связано с vb.net?
Спасибо за чтение,
Samy
Samy, Вы разработали эту проблему здесь? У меня точно такая же проблема? – NabilS
Я не копал дальше код; скорее я использовал метод SearchRestrictions.Query, описанный выше. Хорошо подходит для наших нужд. Удачи и не стесняйтесь публиковать здесь, если найдете решение – samy