微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Lucene.NET搜索突出显示尊重HTML标签

我试图在一个 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,但我不确定.任何帮助,将不胜感激.

解决方法

我想我想通了……

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

它朝着正确的方向前进,但在完成之前还需要做更多的工作.如果有人有更好的解决方案(阅读“TESTED”解决方案),我很乐意听到它.

原文地址:https://www.jb51.cc/html/227089.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐