Только получение условий запроса как выделенных результатов с помощью lucene highlighter (3.0) - PullRequest
1 голос
/ 24 марта 2011

Я использую текущий код, чтобы получить фрагменты для выделения на выходе lucene, но результаты всегда просто поиск строки.

var parser = new MultiFieldQueryParser(new[] { "contents", "PageName" }, 
    new StandardAnalyzer());                   
Query query = parser.Parse(Query);

QueryScorer scorer = new QueryScorer(query);
Formatter formatter = new SimpleHTMLFormatter(config.HighlightFormatterPrefix,
    config.HighlightFormatterSuffix);
Highlighter highlighter = new Highlighter(formatter, scorer);
highlighter.SetTextFragmenter(new SimpleFragmenter(100));
TokenStream stream = new StandardAnalyzer().TokenStream("contents",
    new StringReader(Query));
return highlighter.GetBestFragments(stream, Query, 2, ".");

Если это полезно, вот код, используемый для запроса:

var parser = new MultiFieldQueryParser(new[]{"contents","PageName"}, 
    new StandardAnalyzer());
Query query = parser.Parse(searchString);

Hits results = searcher.Search(query);
var hits = new List<LuceneSearchResult>();
for (int index = 0; index < results.Length(); index++)
{
    Document document = results.Doc(index);

    var searchResult = new LuceneSearchResult();
    searchResult.Document = document;
    searchResult.Query = searchString;
    searchResult.Id = document.GetField("ID").StringValue();
    searchResult.Score = results.Score(index);
    hits.Add(searchResult);
}

Все, что я ищу, совпадает со строкой, возвращаемой для выделенных фрагментов.

1 Ответ

0 голосов
/ 24 марта 2011

Я нашел проблему. Полученный рабочий код был изменен в результатах:

var parser = new QueryParser("contents", new StandardAnalyzer());
Query query = parser.Parse(Query);
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter(config.HighlightFormatterPrefix, config.HighlightFormatterSuffix);
QueryScorer fragmentScorer = new QueryScorer(query,"contents");
Highlighter highlighter = new Highlighter(formatter, fragmentScorer);
highlighter.SetTextFragmenter(new SimpleFragmenter(100));
TokenStream tokenStream = new SimpleAnalyzer().TokenStream(config.MainContentFieldName, new StringReader(field.StringValue()));

return highlighter.GetBestFragments(tokenStream, field.StringValue(), 2, ".");

Я изменил с нескольких полей на одно поле в запросе, поскольку имя страницы никогда не будет полезным в сводке, для которой он используется, и изменил его с Formatter на SimpleFormatter

...