Плагин для подсветки Lucene.NET
Я пытаюсь добавить в свой поиск 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
Спасибо
1 ответ
Вы не представили свою реализацию 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.