2009-08-21 7 views
8

respektiert Ich versuche Suchbegriffe in einem Block von HTML zu markieren, ist das Problem, wenn ein Benutzer eine Suche nach „Farbe“ der Fall ist, folgt aus:Lucene.NET Suchen Hervorhebungen, die HTML-Tag

< span style =‘ Farbe: weiß '> weiß </span >

wird: < span style =' <b> Farbe </b >: weiß‘> <b> weiß </b > </span >

und natürlich meinen Stil vermasselt, ist keine gute Idee. Hier

ist der Code, ich verwende:

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

Ich vermute, das Problem ist, dass ich eine andere Fragmentierers brauchen, aber ich bin nicht sicher. Jede Hilfe wäre willkommen.

Antwort

3

Ich glaube, ich es herausgefunden ...

I subclassed StandardAnalyzer und geändert TokenStream dazu:

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

und Implementiert HtmlStripCharFilter als:

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

Es ist in der rechten Leitung ist Richtung, aber es braucht noch viel mehr Arbeit, bevor es fertig ist. Wenn jemand eine bessere Lösung hat (lies "TESTED" -Lösung) würde ich es gerne hören.

+0

Es klingt irgendwie spezifisch, ich bezweifle, dass jemand eine getestete Lösung hat - aber Sie könnten Ihre Patches immer auf den Lucene.Net contrib hochladen, damit andere es benutzen/testen können. – Prescott