2013-07-04 8 views
8

Sto utilizzando Lucene 4 nella mia applicazione e non voglio cambiarlo. Sto cercando di integrare Neo4J che raggruppa Lucene 3.5 come implementazione di IndexProvider, neo4j-lucene-index.Alternative IndexProvider per Neo4J 1.9.1

Sfortunatamente, neo4j-lucene-index non funziona, e con tale dipendenza esclusa, l'app si blocca all'infinito all'avvio. Ho provato neo4j-lucene4-index ma questo non sembra essere mantenuto molto bene e deve essere aggiornato in modo abbastanza significativo per funzionare con Neo4J 1.9.1. I cambiamenti vanno ben oltre la mia comprensione degli interni di Neo4J.

Tuttavia, posso vedere che IndexProvider è collegabile, quindi spero che esista un'alternativa a Lucene - Non riesco a trovarlo al momento però. Qualcuno può indicarmi la direzione giusta per uno?

Sembra strano che Lucene 4 sia fuori da così tanto tempo ormai e Neo4J non lo supporta. Mi sto perdendo qualcosa?

Attualmente, il mio POM assomiglia a questo per il mio Neo4j config:

<dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-neo4j</artifactId> 
    <version>2.2.1.RELEASE</version> 
    <exclusions> 
     <exclusion> 
     <artifactId>neo4j</artifactId> 
     <groupId>org.neo4j</groupId> 
     </exclusion> 
     <exclusion> 
     <artifactId>neo4j-cypher</artifactId> 
     <groupId>org.neo4j</groupId> 
     </exclusion> 
    </exclusions> 
</dependency> 
<dependency> 
    <groupId>org.neo4j</groupId> 
    <artifactId>neo4j-kernel</artifactId> 
    <version>1.9.1</version> 
    <exclusion> 
     <groupId>org.neo4j</groupId> 
     <artifactId>neo4j-lucene-index</artifactId> 
    </exclusion> 
</dependency> 

<dependency> 
    <groupId>org.neo4j.app</groupId> 
    <artifactId>neo4j-server</artifactId> 
    <version>1.9.1</version> 
    <exclusions> 
     <exclusion> 
     <artifactId>neo4j</artifactId> 
     <groupId>org.neo4j</groupId> 
     </exclusion> 
     <exclusion> 
     <artifactId>neo4j-cypher</artifactId> 
     <groupId>org.neo4j</groupId> 
     </exclusion> 
     <exclusion> 
     <groupId>org.neo4j</groupId> 
     <artifactId>neo4j-lucene-index</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

    <!-- A temporary dependency until Neo4J builds in support for Lucene 4. 
    Looks like they're planning to incorporate this project anyway This project 
    is available on GitHub, and needs to be built with: mvn license:format mvn 
    install to install into your local repo. 
     <dependency> 
      <groupId>com.keatext</groupId> 
      <artifactId>neo4j-lucene4-index</artifactId> 
      <version>1.9.M01-SNAPSHOT</version> 
     </dependency>--> 

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>5.0.1.Final</version> 
</dependency> 
+1

Abbiamo fatto qualche test e Lucene4 era molto più lento per i nostri casi d'uso di 3,6 Ecco perché non ha avuto la priorità. –

+0

Grazie Michael, è interessante. Per il mio caso d'uso, voglio accoppiarlo con i miei dati MongoDB esistenti per gli attraversamenti intorno ai dati correlati. Al momento utilizziamo Lucene 4, ma suppongo che dovrei probabilmente considerare l'impatto del downgrade a 3.6 per i miei requisiti di ricerca interni. Ho alcuni script di test delle prestazioni che posso applicare prima e dopo per confrontare –

risposta

1

Ci sono stati alcuni cambiamenti internamente da 1.8 -> 1.9. In breve, un fornitore di indice deve registrare un KernelExtensionFactory tramite META-INF/services, vedere https://github.com/neo4j/neo4j/blob/master/community/lucene-index/src/main/resources/META-INF/services/org.neo4j.kernel.extension.KernelExtensionFactory

Questa KernelExtensionFactory è il punto di ingresso, solo checkout l'implementazione basata Lucene 3 a https://github.com/neo4j/neo4j/tree/master/community/lucene-index.

+0

Sono sorpreso che non ci sia un'implementazione predefinita incorporata. Grazie per i link, li controllerò. Voglio solo qualcosa di incredibilmente semplice al momento per la dimostrazione del concetto della nostra applicazione. –

+0

Neo4j considera l'indicizzazione come un dettaglio di implementazione e non dipende da nessuna funzione di Lucene4. –

0

Se non ti interessa quale indice utilizza Neo4j e stai utilizzando Maven per gestire le dipendenze, puoi usare the Maven Shade plugin's class relocation feature per rinominare la dipendenza Lucene di Neo4j in modo che non sia in conflitto con altre dipendenze dalle versioni più recenti di Lucene.

Nel mio caso è stato necessario spostare il codice dipendente da Neo4j in un progetto Maven separato, poiché Shade si comporta su un intero progetto/vaso contemporaneamente. Quindi, se riesci a ottenere le tue dipendenze Lucene in conflitto in diversi progetti, questo dovrebbe funzionare alla grande.

1

Qualche tempo fa, ero anche di fronte a questo problema: stavo lavorando alla prototipazione e mi piaceva molto la modalità embedded di Neo4j. Ma, una volta deciso di usare Lucene 4, sono incappato in problemi di incompatibilità.

OSGi

Come suggerito qui: How to use two versions of jar in my java project - una delle possibili soluzioni è quello di utilizzare OSGi, e avvolgere Neo4j e Lucene 4 in diversi fasci. Ogni bundle avrà un classloader separato, quindi Neo4j userà nelle classi di runtime di Lucene 3, ma sarà comunque possibile utilizzare Lucene 4 per i propri scopi.

Ma, per quanto stavo lavorando alla prototipazione, non volevo dedicare del tempo all'adattamento del mio progetto per la piattaforma OSGi per la sola ragione di incompatibilità di due componenti.

Maven Ombra Plugin

problema Così, ho risolto con l'aiuto di Maven Shade Plugin.

Maven Shade Plugin offre la possibilità di unire tutte le dipendenze in un unico JAR "grasso" (chiamato anche "uber JAR").

Quindi, è possibile generare "dipendenza da uber Neo4j" e utilizzarlo nel progetto, anziché "reale" dalla dipendenza Neo4j.

Ma c'è un ulteriore momento importante: Lucene 3 e Lucene 4 hanno la stessa struttura di pacchetto e molte classi hanno ancora gli stessi nomi. Quindi, questo potrebbe causare conflitti di caricamento classi.

per risolvere questo problema, Plugin Maven Ombra offre una capacità di spostare le classi durante la generazione di di "uber JAR": http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

È possibile specificare il nome del pacchetto, e durante il confezionamento - Plugin ombra si sposterà classi da specificato pacchetto e i suoi pacchetti secondari in qualche altro pacchetto, e riscriverà il codice bytecode.

Così, durante la composizione di "uber JAR" per Neo4j - è possibile configurare Plugin Ombra di spostare le classi di Lucene 3 a qualche altro pacchetto, ad esempio:

org.apache.lucene.* -> shaded_3_6_2.org.apache.lucene.*

(Per fortuna, sembra che Neo4j non usa la riflessione, in applicazione alle cose di Lucene).

Quindi, è possibile creare il progetto Maven vuota con i seguenti pom.xml:

<project 
    xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>my.hack</groupId> 
    <artifactId>uber-neo4j</artifactId> 
    <version>1.9.3</version> 
    <packaging>jar</packaging> 
    <name>uber-neo4j</name> 

    <properties> 
     <neo4j-version>1.9.3</neo4j-version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.neo4j</groupId> 
      <artifactId>neo4j</artifactId> 
      <version>${neo4j-version}</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>2.3</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
         <configuration> 
          <createDependencyReducedPom>false</createDependencyReducedPom> 
          <relocations> 
           <relocation> 
            <pattern>org.apache.lucene</pattern> 
            <shadedPattern>shaded_lucene_3_6_2.org.apache.lucene</shadedPattern> 
           </relocation> 
          </relocations> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

    <repositories> 
     <repository> 
      <id>neo4j-repo</id> 
      <name>Neo4j Repository</name> 
      <url>http://m2.neo4j.org/content/repositories/releases</url> 
     </repository> 
    </repositories> 
</project> 

configurazione descritta - fornisce una capacità di generare "uber JAR" per Neo4j con pacchetti rinominati di Lucene 3 (basta fare mvn install) .

E, infine, è possibile allegare questa roba come modulo al progetto Maven.

Quindi, dopo questa soluzione alternativa, sarà possibile utilizzare entrambi: Neo4j e Lucene 4 nel progetto.

Solo nel caso, qui è link per repository GitHub con la configurazione Maven per la generazione di "uber JAR" per Neo4j: https://github.com/lagodiuk/neo4j-uber-jar