【问题标题】:Lucene.NET Search Highlighting that respects HTML Tags尊重 HTML 标签的 Lucene.NET 搜索突出显示
【发布时间】:2009-08-22 07:04:05
【问题描述】:

我试图突出显示 HTML 块中的搜索词,问题是如果用户搜索“颜色”,则:

白色

变成: White

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

这是我正在使用的代码:

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

【问题讨论】:

    标签: lucene.net nhibernate.search


    【解决方案1】:

    我想我明白了……

    我继承了 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”解决方案),我很想听听。

    【讨论】:

    • 这听起来有点具体,我怀疑任何人都有经过测试的解决方案 - 但您始终可以将您的补丁上传到 Lucene.Net 贡献者,以便其他人可以使用/测试它。
    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多