Плагин для подсветки Lucene.NET - PullRequest
1 голос
/ 18 октября 2010

Я пытаюсь добавить маркер 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 Ответ

3 голосов
/ 28 декабря 2010

Вы не отправили свою реализацию 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. Вы можете просто использовать форматер SimpleHTMLFormatter, который поставляется с Highlighter.Net. И в то же время, есть также SimpleHTMLEncoder, который, вероятно, делает то, что делает ваш HtmlEncoder.

...