2009-08-21 21 views
8

Estoy tratando de resaltar los términos de búsqueda en un bloque de HTML, el problema es que si un usuario hace una búsqueda de "color", esto:Lucene.NET Buscar resaltado que respete las etiquetas HTML

< span style =' Color: blanco '> blanca </span >

se convierte en: estilo < lapso =' <b> de color </b >: blanco' > <b> blanca </b > </span >

y obviamente, arruinar mi estilo no es una buena idea.

Aquí está el código que estoy utilizando:

 Query parsedQuery = parser.Parse(luceneQuery); 
     StandardAnalyzer Analyzer = new StandardAnalyzer(); 
     SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<b class='search'>", "</b>"); 

     QueryScorer scorer = new QueryScorer(parsedQuery); 
     Highlighter highlighter = new Highlighter(formatter, scorer); 

     highlighter.SetTextFragmenter(new SimpleFragmenter()); 
     Highlighter.GetBestFragment(Analyzer, propertyName, invocation.ReturnValue.ToString()) 

estoy adivinando el problema es que necesito un fragmentador diferente, pero no estoy seguro. Cualquier ayuda sería apreciada.

Respuesta

3

Creo que lo he descubierto ...

I subclases StandardAnalyzer y cambiaron TokenStream a esto:

public override Lucene.Net.Analysis.TokenStream TokenStream(string fieldName, System.IO.TextReader reader) 
    { 
     var start = base.TokenStream(fieldName, reader); 
     HtmlStripCharFilter filter = new HtmlStripCharFilter(reader); 
     TokenStream result = new StandardFilter(filter); 
     return new StopFilter(new LowerCaseFilter(result), this.stopSet); 
    } 

e implementado HtmlStripCharFilter como:

public class HtmlStripCharFilter : Lucene.Net.Analysis.CharTokenizer 
{ 
    private bool inTag = false; 

    public HtmlStripCharFilter(TextReader input) 
     : base(input) 
    { 
    } 

    protected override bool IsTokenChar(char c) 
    { 
     if (c == '<' && inTag == false) 
     { 
      inTag = true; 
      return false; 
     } 
     if (c == '>' && inTag) 
     { 
      inTag = false; 
      return false; 
     } 

     return !inTag && !Char.IsWhiteSpace(c); 
    } 
} 

Se dirige a la derecha dirección, pero aún necesita mucho más trabajo antes de que se haga. Si alguien tiene una solución mejor (léase solución "PROBADA") Me encantaría escucharla.

+0

Suena un poco específico, dudo que alguien tenga una solución probada, pero siempre puedes subir tus parches al contrib de Lucene.Net para que otros puedan usarlo/probarlo. – Prescott

Cuestiones relacionadas