2009-08-21 18 views
8

sto cercando di evidenziare i termini di ricerca in un blocco di codice HTML, il problema è se un utente fa una ricerca per "colore", in questo modo:Lucene.NET l'evidenziazione della ricerca che rispetta i tag HTML

< span style =' colore: bianco '> bianco </span >

diventa: < span style =' <b> colore </b >: bianco' > <b> bianco </b > </span >

e ovviamente, incasinare il mio stile non è una buona idea.

Ecco il codice che sto usando:

 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()) 

Sto indovinando il problema è che ho bisogno di un Fragmenter diversa, ma non sono sicuro. Qualsiasi aiuto sarebbe apprezzato.

risposta

3

penso ho capito ...

I sottoclasse StandardAnalyzer e cambiato TokenStream a questo:

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 implementato HtmlStripCharFilter come:

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); 
    } 
} 

E 'andando nella giusta direzione, ma ha ancora bisogno di molto più lavoro prima che sia fatto. Se qualcuno ha una soluzione migliore (leggi la soluzione "TESTED") mi piacerebbe sentirla.

+0

Sembra un po 'specifico, dubito che qualcuno abbia una soluzione testata, ma è sempre possibile caricare le patch sul contributo Lucene.Net in modo che altri possano usarlo/testarlo. – Prescott