views:

412

answers:

1

I am using the Lucene.NET API directly in my ASP.NET/C# web application. When I search using a wildcard, like "fuc*", the highlighter doesn't highlight anything, but when I search for the whole word, like "fuchsia", it highlights fine. Does Lucene have the ability to highlight using the same logic it used to match with?

Various maybe-relevant code-snippets below:

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);

and then on each hit...

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, "...");

And I'm using the QueryParser and the StandardAnalyzer.

+1  A: 

you'll need to ensure you set the parser rewrite method to SCORING_BOOLEAN_QUERY_REWRITE.

This change seems to have become necessary since Lucene v2.9 came along.

Hope this helps,

Moleski
Errr... how? From what I've seen in the docs, I need a MultiTermQuery to mess with that, but I only have a Query. Should I test for typeof MultiTermQuery and cast up?
Scott Stafford
I blindly tried: query = parser.Parse(searchText); if (query.GetType() == typeof(Lucene.Net.Search.PrefixQuery)) { ((Lucene.Net.Search.PrefixQuery)query).SetRewriteMethod(Lucene.Net.Search.PrefixQuery.SCORING_BOOLEAN_QUERY_REWRITE); }and it made things worse.
Scott Stafford
I actually meant to set the rewrite style on the parser. i.e. using the SetMultiTermRewriteMethod method of the parser object. HTH
Moleski