Я пытаюсь получить класс Highlighter от Lucene для правильной работы с токенами, поступающими из WordDelimiterFilter от Solr. Он работает 90% времени, но если текст соответствия содержит «» такие, как „1500“ выход неправилен:Solr WordDelimiterFilter + Lucene Highlighter
Ожидаемое: „тест это“ Наблюдаемые
: ' тест 1 это
Я в настоящее время не уверен, является ли он Highlighter портя рекомбинации или WordDelimiterFilter портя лексемизацию но что-то не устраивает. Вот соответствующие зависимости от моего ПОМ:
org.apache.lucene Lucene-жильный 2.9.3 баночка компилировать org.apache.lucene Lucene-фломастер 2.9.3 баночка составить org.apache.solr ГУМЗ-ядро 1.4.0 банку составить
А вот простой JUnit тестовый класс, демонстрирующий проблему:
package test.lucene;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.util.Version;
import org.apache.solr.analysis.StandardTokenizerFactory;
import org.apache.solr.analysis.WordDelimiterFilterFactory;
import org.junit.Test;
public class HighlighterTester {
private static final String PRE_TAG = "<b>";
private static final String POST_TAG = "</b>";
private static String[] highlightField(Query query, String fieldName, String text)
throws IOException, InvalidTokenOffsetsException {
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter(PRE_TAG, POST_TAG);
Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query, fieldName));
highlighter.setTextFragmenter(new SimpleFragmenter(Integer.MAX_VALUE));
return highlighter.getBestFragments(getAnalyzer(), fieldName, text, 10);
}
private static Analyzer getAnalyzer() {
return new Analyzer() {
@Override
public TokenStream tokenStream(String fieldName, Reader reader) {
// Start with a StandardTokenizer
TokenStream stream = new StandardTokenizerFactory().create(reader);
// Chain on a WordDelimiterFilter
WordDelimiterFilterFactory wordDelimiterFilterFactory = new WordDelimiterFilterFactory();
HashMap<String, String> arguments = new HashMap<String, String>();
arguments.put("generateWordParts", "1");
arguments.put("generateNumberParts", "1");
arguments.put("catenateWords", "1");
arguments.put("catenateNumbers", "1");
arguments.put("catenateAll", "0");
wordDelimiterFilterFactory.init(arguments);
return wordDelimiterFilterFactory.create(stream);
}
};
}
@Test
public void TestHighlighter() throws ParseException, IOException, InvalidTokenOffsetsException {
String fieldName = "text";
String text = "test 1,500 this";
String queryString = "1500";
String expected = "test " + PRE_TAG + "1,500" + POST_TAG + " this";
QueryParser parser = new QueryParser(Version.LUCENE_29, fieldName, getAnalyzer());
Query q = parser.parse(queryString);
String[] observed = highlightField(q, fieldName, text);
for (int i = 0; i < observed.length; i++) {
System.out.println("\t" + i + ": '" + observed[i] + "'");
}
if (observed.length > 0) {
System.out.println("Expected: '" + expected + "'\n" + "Observed: '" + observed[0] + "'");
assertEquals(expected, observed[0]);
}
else {
assertTrue("No matches found", false);
}
}
}
Кто-нибудь есть какие-либо идеи или предложения?
Вы отправили патч в список рассылки? Я просто столкнулся с этой ошибкой и не был уверен, что это. Было бы замечательно, чтобы это было исправлено. –
Извините, Дэн, нет. Причина в том, что я не могу понять, где. Я даже не могу найти bugzilla для Lucene, не говоря уже о Lucene Highlighter. У вас есть адрес списка рассылки? Пожалуйста, напишите здесь, и когда я увижу его дальше, я увижу, могу ли я представить это предложение. – Lucas
https://issues.apache.org/jira/browse/Lucene и https://issues.apache.org/jira/browse/SOLR - похоже, что это было рассмотрено три недели назад: https: //issues.apache. орг/JIRA/просмотр/Lucene-2874 –