2015-07-24 1 views
0

Если у меня есть FullText поле с этим содержимымСделать Lucene.net Highlighter шоу Матчи из определенного поля только

In 2014 and 2015 the results were ... [more] ... and Sony are developing ... [more] 

И запросов для

+loadTime:[2014 TO 2015] +fullText:sony 

Маркера набирает 2014 и 2015 как лучший фрагмент. Как заставить маркер игнорировать совпадения от loadTime часть запроса и использовать совпадения из fullText часть поиска? Я хочу увидеть ... sony ... фрагмент, даже если он оценивается ниже, чем части даты, которые (как только что произошло) совпадают с fullText.

Мой код:

ScoreDoc[] hits = [create search]; 
IFormatter formatter = new SimpleHTMLFormatter("<b>", "</b>"); 
QueryScorer scorer = new QueryScorer(query,); 
Highlighter highlighter = new Highlighter(formatter, scorer); 

for (int i = 0; i < hits.Length; i++) 
{ 
    int docId = hits[i].Doc; 
    float score = hits[i].Score; 
    Document doc = search.Doc(docId); 

    string fragments = string.Empty; 
    if (collectFragments) 
    { 
     TokenStream stream = _analyzer.TokenStream("", new StringReader(doc.Get(AppConstants.Fields.FullText))); 
     fragments = highlighter.GetBestFragments(stream, doc.Get(AppConstants.Fields.FullText), 2, "..."); 
    } 

    ... 
} 

ответ

0

Выражение "+ время загрузки: [2014 TO 2015] + FullText: сони", кажется, означает вы хотите матч документы, в которых время загрузки между 2014 и 2015 и содержит сони в полнотекстовых. Извините, я прочитал Lucene In Action (3.1.2 Разбор пользовательского выражения запроса: QueryParser) и посмотрел на queryparsersyntax.html, но не нашел способа написать выражение запроса, подобное вашему. Ближайший -

loadTime:[2014 TO 2015] AND fullText:sony 

Возможно, из-за версии выпуска, мой Lucene 3.4.0. И способ, чтобы решить вашу проблему, может быть QueryScore

/** 
* @param query Query to use for highlighting 
* @param field Field to highlight - pass null to ignore fields 
*/ 
public QueryScorer(Query query, String field) { 
    init(query, field, null, true); 
} 

В своем коде, я видел, как ты покинул этот параметр незаполненным. Я пробовал свой Intellij с Scala, и это сработало, вот код.

def singleFieldHighlighter = { 
    val textToDivide = "In 2016 and 2017 the results were ... [more] ... and Sony are developing ... [more]" 
    val tokenStream = new StandardAnalyzer(Version.LUCENE_30).tokenStream("fullText", new StringReader(textToDivide)); 
    val searchString = "loadTime:[2014 TO 2015] AND fullText:sony" 
    val parser = new QueryParser(version, "fullText", new WhitespaceAnalyzer(version)) 
    val parsedQuery = parser.parse(searchString) 

    val scorer = new QueryScorer(parsedQuery, "fullText") 
    val formatter = new SimpleHTMLFormatter("<span class='highlight'>", "</span>") 
    val highlighter = new Highlighter(formatter, scorer) 
    highlighter.setTextFragmenter(new SimpleSpanFragmenter(scorer)) 
    highlighter.getBestFragments(tokenStream, textToDivide, 3, "...") 
} 


// The result 
// In 2014 and 2015 the results were ... [more] ... and <span class='highlight'>Sony</span> are developing ... [more] 

Надеется, что это помогает, если нет, то я предлагаю вам прочитать главу Lucene в действии, я уже упоминал выше, чтобы понять это.

+0

См. Этот бит, как использовать «+» в синтаксисе запроса lucene: https://lucene.apache.org/core/2_9_4/queryparsersyntax.html#+. См. Также: «Почему не И, ИЛИ, И НЕ?»] (Https://lucidworks.com/blog/why-not-and-or-and-not/), почему синтаксис +/- lucene намного больше выражая фактическое поведение запроса lucene. – femtoRgon