#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. Потерял контроль над этим, понятия не имею, анализируются поля или нет. Все, что я сейчас делаю, это то, что мои запросы больше не чувствительны к регистру, что было моей первоначальной проблемой, поэтому я отмечу это как решенное