Ich versuche, die Textmarker-Klasse von Lucene korrekt mit Token aus Solrs WordDelimiterFilter zu arbeiten. Es funktioniert 90% der Zeit, aber wenn der passende Text enthält ein ‚‘ wie ‚1500‘, der Ausgang ist falsch:Solr WordDelimiterFilter + Lucene Textmarker
Erwartet: ‚test dieser‘
Beobachtet: ' Test 1 dieses
ich bin derzeit nicht sicher, ob es Highlighter verwirren die tokenization die Rekombination oder WordDelimiterFilter vermasselt ist, aber etwas ist unglücklich. Hier sind die entsprechenden Abhängigkeiten von meinem pom:
org.apache.lucene lucene-Kern 2.9.3 jar org.apache.lucene lucene-Highlighter 2.9.3 jar kompilieren kompilieren org.apache.solr solr-Kern 1.4.0 jar kompilieren
Und hier ist eine einfache JUnit-Testklasse demonstriert das Problem:
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);
}
}
}
Wer irgendwelche Ideen oder Anregungen?
Haben Sie einen Patch an die Mailingliste gesendet? Ich habe gerade diesen Fehler auch gesehen und war mir nicht sicher, was es war. Wäre super, um es zu reparieren. –
Entschuldigung Dan, nein, habe ich nicht. Der Grund ist, ich kann nicht herausfinden, wo. Ich kann nicht einmal das Bugzilla für Lucene finden, geschweige denn Lucene Highlighter. Hast du die Adresse der Mailingliste? Bitte poste hier und wenn ich es als nächstes sehe, werde ich sehen, ob ich diesen Vorschlag einreichen kann. – Lucas
https://issues.apache.org/jira/browse/Lucene und https://issues.apache.org/jira/browse/SOLR - sieht so aus als wäre dies vor drei Wochen adressiert worden: https: //issues.apache. org/jira/browse/LUCENE-2874 –