StandardAnalyzer, похоже, не участвует в индексации данных, NHibernate.Search - PullRequest
0 голосов
/ 27 апреля 2011

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

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

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

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

1 Ответ

0 голосов
/ 27 апреля 2011

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

В итоге я настроил его глобально.Я использую 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.Search.Environment.AnalyzerClass.Забавно то, что он не будет работать для общих полнотекстовых запросов (я думаю, что Lucene будет использовать StandardAnalyzer), но это другая история:).

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

...