Neo4j Lucene WhitespaceAnalyzer abändern - Tutorial

Warum auch immer nutzt Neo4j als Lucene-Indexer den WhitespaceAnalyzer. Dieser hat jedoch viele Nachteile, dass es wünschenswert sein kann diesen abzuändern. Leider bringt Neo4j von Hause aus keine Möglichkeit mit, dies mit einfachen Mitteln vorzunehmen. Es scheint als wenn die Lucene Implementation nicht weit vorangeschritten ist. Es wird auch immer noch die Lucene Version 3.6 verwendet, obwohl bereits Lucene 4.10 die aktuellste ist. Nichtsdestotrotz in einem Projekt brauchte ich den normalen StandardAnalyzer um Neo4j mit OrientDB vergleichen zu können. Wenn ihr einen ähnlichen Vergleich vorhabt, kann dieses Tutorial also sehr hilfreich sein.

Klasse MyStandardAnalyzer anlegen

Am einfachsten legt ihr zuerst eine Klasse MyStandardAnalyzer an. Diese füllt ihr mit folgendem Code:

import java.io.Reader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.util.Version;
public class MyStandardAnalyzer extends Analyzer {
    private final Analyzer actual;
    public MyStandardAnalyzer() {
        actual = new StandardAnalyzer(Version.LUCENE_36);
    }
    public TokenStream tokenStream(String fieldName, Reader reader) {
        return actual.tokenStream(fieldName, reader);
    }
}

Diese Klasse können wir folglich verwenden und tauschen damit den WhitespaceAnalyzer gegen den StandardAnalyzer.

Importer Code Analyzer Variable erzeugen

Wir machen im Importer Code den neuen StandardAnalyzer mit folgender Anweisung bekannt:

public class Importer {
    ...
    private boolean TESTBETRIEB = false;

    public static final Map<String, String> LUCENE_SACONFIG = Collections
            .unmodifiableMap(MapUtil.stringMap(IndexManager.PROVIDER,
                    LuceneIndexImplementation.SERVICE_NAME, "analyzer",
                    MyStandardAnalyzer.class.getName()));

    public Importer(String database, String csvDir) {

    ....

Indexierungs-Anweisung abändern

Nun fehlt nur noch die einzelnen Indexe abzuändern. Hier jetzt beispielhaft am Title-Index gezeigt:

BatchInserterIndex titleIndex = index.nodeIndex("titles", LuceneIndexImplementation.FULLTEXT_CONFIG);

muss abgeändert werden in:

BatchInserterIndex titleIndex = null;
        try {
            titleIndex = index.nodeIndex("titles", LUCENE_SACONFIG);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }

Der Try-Catch-Block ist natürlich nicht unbedingt notwendig. Nur als Sicherheits-Maßnahme. MAcht das ebenso bei den restlichen Indexen.

Fazit

Ein sehr schwieriges Unterfangen für eine simple Aufgabe. Dennoch mit ein wenig eigener Implementierung ist es möglich Neo4j eine ordentliche Lucene-Indexierung beizubringen.

Kommentar schreiben

Kommentare: 0