StandardAnalyzer, похоже, не участвует при индексации данных, NHibernate.Поиск

#lucene.net #nhibernate.search

#lucene.net #nhibernate.search

Вопрос:

Я создаю функцию поиска для приложения с Lucene.NET и NHibernate.Поиск. Для индексации существующих данных я использую этот метод:

 public void SynchronizeIndexForAllUsers()
    {
        var fullTextSession = Search.CreateFullTextSession(m_session);
        var users = GetAll();
        foreach (var user in users)
        {
            if (!user.IsDeleted)
            {
                fullTextSession.Index(user);
            }
        }
    }
  

Где я пометил поля, которые я хочу проиндексировать, следующим атрибутом:

 [Field(Index.Tokenized, Store = Store.Yes, Analyzer = typeof(StandardAnalyzer))]
public virtual string FirstName
    {
        get { return m_firstName; }
        set { m_firstName = value; }
    }
  

Но когда я затем проверяю индексы в Luke, в полях все еще есть прописные буквы, запятые и т.д. который должен был быть удален StandardAnalyzer.

Кто-нибудь знает, что я делаю не так?

Ответ №1:

У меня была аналогичная проблема с вашей, но я пытался использовать WhitespaceAnalyzer. Установка его в атрибуте Field у меня тоже не сработала.

В итоге я установил его глобально. Я использую FluentNHibernate для настройки, и это выглядит так:

 this._sessionFactory =
    Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2005
        .ConnectionString(cs => cs
        // cut
    .ShowSql()
     )
     .Mappings(m => m.FluentMappings
     // cut
     )
     .ExposeConfiguration(cfg =>
     {
         // important part: lucene.net and nhibernate.search
         cfg.SetProperty("hibernate.search.default.directory_provider", typeof(NHibernate.Search.Store.FSDirectoryProvider).AssemblyQualifiedName);
         cfg.SetProperty("hibernate.search.default.indexBase", @"~Lucene");
         cfg.SetProperty("hibernate.search.indexing_strategy", "event");
         cfg.SetProperty(NHibernate.Search.Environment.AnalyzerClass, typeof(WhitespaceAnalyzer).AssemblyQualifiedName);
         cfg.SetListener(NHibernate.Event.ListenerType.PostUpdate, new FullTextIndexEventListener());
         cfg.SetListener(NHibernate.Event.ListenerType.PostInsert, new FullTextIndexEventListener());
         cfg.SetListener(NHibernate.Event.ListenerType.PostDelete, new FullTextIndexCollectionEventListener());
     })
     .BuildSessionFactory();
  

Взгляните на NHibernate.Поиск.Окружающая среда.Класс анализатора. Забавно, что это не будет работать для общих полнотекстовых запросов (я думаю, что Lucene будет использовать StandardAnalyzer), но это уже другая история :).

Надеюсь, это поможет.

Комментарии:

1. Кажется, теперь это работает, когда я добавил свойство класса analyzer. Но при ближайшем рассмотрении кажется, что он работает даже без него. но Luke по-прежнему отображает каждое поле таким, каким оно было до его анализа.

2. Потерял контроль над этим, понятия не имею, анализируются поля или нет. Все, что я сейчас делаю, это то, что мои запросы больше не чувствительны к регистру, что было моей первоначальной проблемой, поэтому я отмечу это как решенное