2009-07-06 6 views
2

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

+0

Samy, Вы разработали эту проблему здесь? У меня точно такая же проблема? – NabilS

+0

Я не копал дальше код; скорее я использовал метод SearchRestrictions.Query, описанный выше. Хорошо подходит для наших нужд. Удачи и не стесняйтесь публиковать здесь, если найдете решение – samy

ответ

1

Похоже, это был решен с пересмотром 1611 из NHibernate.Search:

Редакция: 1611

Сообщения: Исправлена ​​ошибка где сравнивалось полное имя класса с частичным. Это вызвало отказ LuceneQueryTest.UsingCriteriaApi.

Изменено: /trunk/src/NHibernate.Search/src/NHibernate.Search/Query/FullTextQueryImpl.cs

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

+0

Спасибо за хед-ап. Проблема была решена с помощью другого подхода, но приятно слышать, что это было исправлено :) – samy