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". なんで?

これを賢明に動作させるにはどうすればよいですか?

を使用してStandardAnalyzerおり、クエリは次のようになります"content:lorem"

*編集: * Lucene.NET 2.9.2 を使用しています

ありがとう

4

1 に答える 1

3

StrongFormatterまたはの実装を提出していませんが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 に答える