2009-08-21 8 views
8

मैं HTML के एक ब्लॉक में खोज शब्दों को हाइलाइट करने के लिए कोशिश कर रहा हूँ, समस्या, यदि कोई उपयोगकर्ता "रंग" के लिए एक खोज करता है यह:Lucene.NET खोजें हाइलाइटिंग कि सम्मान करता एचटीएमएल टैग

< span style = ' रंग: सफेद '> व्हाइट </span >

हो जाता है: < span style =' < ख > रंग </b >: सफेद '> < ख > व्हाइट </बी > </अवधि >

और जाहिर है, मेरी शैली को गड़बड़ करना एक अच्छा विचार नहीं है।

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

मैं इस समस्या अनुमान लगा रहा हूँ कि मैं एक अलग Fragmenter की जरूरत है, लेकिन मुझे यकीन है कि नहीं कर रहा हूँ:

यहाँ कोड मैं का उपयोग कर रहा है। किसी भी सहायता की सराहना की जाएगी।

उत्तर

3

मुझे लगता है कि मैं इसे समझ से बाहर ...

मैं StandardAnalyzer subclassed है और इस के लिए TokenStream बदल दिया है:

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

और के रूप में HtmlStripCharFilter लागू:

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

यह सही में आगे बढ़ रहा है दिशा, लेकिन इसे पूरा करने से पहले अभी भी बहुत अधिक काम की जरूरत है। अगर किसी के पास बेहतर समाधान है ("टेस्टेड" समाधान पढ़ें) मुझे यह सुनना अच्छा लगेगा।

+0

यह बहुत विशिष्ट लगता है, मुझे संदेह है कि किसी के पास एक परीक्षण समाधान है - लेकिन आप हमेशा अपने पैच को Lucene.Net contrib पर अपलोड कर सकते हैं ताकि अन्य इसका उपयोग कर सकें/परीक्षण कर सकें। – Prescott

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^