2010-05-14 82 views
6

我在我的ASP.NET/C# web应用程序中直接使用Lucene.NET API。当我使用通配符进行搜索时,如“fuc *”,荧光笔不会突出显示任何内容,但是当我搜索整个单词时,如“紫红色”,它会突出显示。 Lucene是否有能力使用与之相匹配的相同逻辑来突出显示?如何让Lucene(.NET)使用通配符正确突出显示?

各种可能相关的下面的代码片段:

var formatter = new Lucene.Net.Highlight.SimpleHTMLFormatter(
    "<span class='srhilite'>", 
    "</span>"); 

var fragmenter = new Lucene.Net.Highlight.SimpleFragmenter(100); 
var scorer = new Lucene.Net.Highlight.QueryScorer(query); 
var highlighter = new Lucene.Net.Highlight.Highlighter(formatter, scorer); 
highlighter.SetTextFragmenter(fragmenter); 

,然后在每一击...

string description = Server.HtmlEncode(doc.Get("Description")); 
var stream = analyzer.TokenStream("Description", 
    new System.IO.StringReader(description)); 
string highlighted_text = highlighter.GetBestFragments(
    stream, description, 1, "..."); 

而且我用的QueryParser和StandardAnalyzer。

回答

4

您需要确保将解析器重写方法设置为SCORING_BOOLEAN_QUERY_REWRITE

自Lucene v2.9出现以来,这一改变似乎变得必要。

希望这会有所帮助,

+0

错误......怎么回事?从我在文档中看到的,我需要一个MultiTermQuery来解决这个问题,但我只有一个Query。我应该测试typeof MultiTermQuery并投射吗? – 2010-05-18 13:42:44

+0

我一味地尝试过: query = parser.Parse(searchText); ((Lucene.Net.Search.PrefixQuery)query).SetRewriteMethod(Lucene.Net.Search.PrefixQuery.SCORING_BOOLEAN_QUERY_REWRITE);如果(query.GetType()== typeof(Lucene.Net.Search.PrefixQuery)) {(Lucene.Net.Search.PrefixQuery)query)。 } 它让事情变得更糟。 – 2010-05-18 13:49:20

+2

我的意思是在解析器上设置重写样式。即使用解析器对象的SetMultiTermRewriteMethod方法。 HTH – 2010-05-18 17:46:18