9

我正在尝试突出显示 HTML 块中的搜索词,问题是如果用户搜索“颜色”,这个:

<span style='color: white'>白色</span>

变为:<span style=' <b>color</b> : white'><b>White</b></span>

显然,搞乱我的风格不是一个好主意。

这是我正在使用的代码:

        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,但我不确定。任何帮助,将不胜感激。

4

1 回答 1

3

我想我想通了...

我将 StandardAnalyzer 子类化并将 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);
    }
}

它朝着正确的方向前进,但在完成之前仍需要做更多的工作。如果有人有更好的解决方案(阅读“测试”解决方案),我很想听听。

于 2009-08-21T23:04:05.357 回答