Lucene.NET荧光笔插件奇怪地突出显示

时间:2010-10-18 18:29:05

标签: lucene.net lucene-highlighter

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

下面突出显示代码:

// 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"。为什么呢?

如何让这种行为明智?

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

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

由于

1 个答案:

答案 0 :(得分:3)

您尚未提交StrongFormatterHtmlEncoder的实施,但我会说您的实施错误位于第一个。它需要检查传递的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元素中包装匹配的人。您可以使用Highlighter.Net附带的SimpleHTMLFormatter格式化程序。虽然在它的同时,还有一个SimpleHTMLEncoder,它可能与你的HtmlEncoder相同。