2010-10-18 59 views
1

我想添加Lucene.NET熒光筆到我的搜索,但它做了一些真奇怪的突出顯示,我做錯了什麼?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

感謝

回答

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。

+0

該死的,多數民衆贊成在尷尬!謝謝,這已經讓我發瘋了!如此明顯! – 2010-12-28 20:59:03