1

我正在尝试将 Lucene.NET Highlighter 添加到我的搜索中,但是它做了一些非常奇怪的突出显示,我做错了什么?

下面是高亮代码:

// stuff here to get scoreDocs

var content = doc.GetField("content").StringValue();
// content = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been"


var highlighter = new Highlighter(new StrongFormatter(), new HtmlEncoder(), new QueryScorer(query.Rewrite(indexSearcher.GetIndexReader())));
highlighter.SetTextFragmenter(new SimpleFragmenter(100));
var tokenStream = analyzer.TokenStream("content", new StringReader(content));

var bestFragment = highlighter.GetBestFragment(tokenStream, content);

搜索给"lorem"了我这个 bestFragment 值:

<strong>Lorem</strong> <strong>Ipsum</strong> is <strong>simply</strong> <strong>dummy</strong> <strong>text</strong> of the <strong>printing</strong> and <strong>typesetting</strong> <strong>industry</strong>. <strong>Lorem</strong> <strong>Ipsum</strong> <strong>has</strong> <strong>been</strong>

如您所见,它突出显示的不仅仅是"Lorem". 为什么?

我如何使这个行为明智?

我正在使用 aStandardAnalyzer我的查询看起来像"content:lorem"

*编辑:*我使用 Lucene.NET 2.9.2

谢谢

4

1 回答 1

3

您尚未提交StrongFormatteror的实现HtmlEncoder,但我想说您的实现错误在第一个错误中。它需要检查通过的分数TokenGroup来决定是否需要任何格式。

public class StrongFormatter : Formatter {
    public String HighlightTerm(String originalText, TokenGroup tokenGroup) {
        var score = tokenGroup.GetTotalScore();
        if (score == 0)
            return originalText;

        return String.Concat("<strong>", originalText, "<strong>");
    }
}

但是,您不是第一个想要将匹配项包装在 html 元素中的人。您可以只使用SimpleHTMLFormatterHighlighter.Net 附带的格式化程序。在此期间,还有一个SimpleHTMLEncoder可能与您的 HtmlEncoder 所做的一样。

于 2010-12-28T06:37:26.853 回答