2010-12-01 17 views
5

He creado un script de tablas de bases de datos, vistas y procedimientos almacenados de MsSqlServer en una estructura de directorios que luego estoy indexando con Lucene.net. La mayoría de los nombres de mi tabla, vista y procedimiento contienen guiones bajos.Lucene.Net Underscores causando división de tokens

Uso el StandardAnalyzer. Si consulto una tabla llamada tIr_ InvoiceBtnWtn01, por ejemplo, recibo visitas para tIr y para InvoiceBtnWtn01, en lugar de solo para _InvoiceBtnWtn01.

Creo que el problema es que el tokenizer se está dividiendo en _ (guión bajo) ya que es la puntuación.

¿Hay alguna manera (simple) de eliminar los guiones bajos de la lista de puntuación o hay otro analizador que debería usar para sql y lenguajes de programación?

+0

Estoy intentando el StopAnalyzer y la WhitespaceAnalyzer ahora. Entonces, parece que WhitespaceAnalyzer puede ser el camino a seguir. – automatic

Respuesta

4

Sí, el StandardAnalyzer se divide en guión bajo. WhitespaceAnalyzer no. Tenga en cuenta que puede usar PerFieldAnalyzerWrapper para usar diferentes analizadores para cada campo; es posible que desee conservar parte de la funcionalidad del analizador estándar para todo excepto en el nombre de tabla/columna.

WhitespaceAnalyzer solo hace divisiones en espacios en blanco. No minúsculas sus tokens, por ejemplo. Por lo tanto, es posible que desee crear su propio analizador que combine WhitespaceTokenizer y LowercaseFilter, o busque en LowercaseTokenizer.

EDIT: analizador personalizado simple (en C#, pero se puede traducir a Java con bastante facilidad):

// Chains together standard tokenizer, standard filter, and lowercase filter 
class MyAnalyzer : Analyzer 
{ 
    public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader) 
    { 
     StandardTokenizer baseTokenizer = new StandardTokenizer(Lucene.Net.Util.Version.LUCENE_29, reader); 
     StandardFilter standardFilter = new StandardFilter(baseTokenizer); 
     LowerCaseFilter lcFilter = new LowerCaseFilter(standardFilter); 
     return lcFilter; 
    } 
} 
+1

Creo que querré tokens en minúscula. Supongo que no hay una forma de "compilación no fuente" de combinar espacios en blanco y minúsculas. ¿Cuál es la diferencia entre usar LowercaseFilter y lowercaseTokenizer? – automatic

+0

@automatic: He agregado un ejemplo de cómo encadenar filtros/tokenizadores juntos. En general, Solr pretende ser la versión "fácil de usar" de lucene, así que sí, no hay una forma de hacerlo que no requiera escribir código si solo usas lucene. Pero eso es casi intencional. – Xodarap

+0

@automatic: Además, LowercaseTokenizer es LowercaseFilter + LetterTokenizer; mirando LetterTokenizer, también se dividirá en guión bajo. Entonces eso no es lo que quieres. Lo siento. – Xodarap