StandardAnalyzer sembra non essere coinvolti durante l'indicizzazione dei dati, NHibernate.Search
-
24-10-2019 - |
Domanda
Im la costruzione di una funzione di ricerca per un'applicazione con Lucene.NET e NHibernate.Search. Per indicizzare i dati esistenti Sto usando questo metodo:
public void SynchronizeIndexForAllUsers()
{
var fullTextSession = Search.CreateFullTextSession(m_session);
var users = GetAll();
foreach (var user in users)
{
if (!user.IsDeleted)
{
fullTextSession.Index(user);
}
}
}
Dove ho segnato i campi voglio indice con i seguenti attributi:
[Field(Index.Tokenized, Store = Store.Yes, Analyzer = typeof(StandardAnalyzer))]
public virtual string FirstName
{
get { return m_firstName; }
set { m_firstName = value; }
}
Ma quando poi ispezionare l'indicies in Luca campi hanno ancora uppercases, virgole ecc che avrebbe dovuto essere rimosso dal StandardAnalyzer.
Qualcuno ha sapere che cosa sto facendo male?
Soluzione
Ho avuto problemi simile al tuo, ma ho cercato di utilizzare WhitespaceAnalyzer. Impostazione in campo attributo non ha funzionato per me.
Ho finito per impostarlo a livello globale. Sto usando FluentNHibernate per la configurazione e sembra che:
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();
Date un'occhiata a NHibernate.Search.Environment.AnalyzerClass. La cosa divertente è che non funzionerà per le query full-text generici (penso che Lucene utilizzerà StandardAnalyzer), ma questa è un'altra storia.)
Spero che questo aiuti.