StandardAnalyzer, похоже, не участвует в индексации данных, NHibernate.Search
Я создаю функцию поиска для приложения с 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 ответ
У меня была похожая проблема с вашей, но я пытался использовать 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), но это другая история:).
Надеюсь это поможет.