1

In meinem Neo4j 3.0.3 und SDN 4.2.0.BUILD-snapshot ich folgende Konfiguration erstellt haben:Neo4j 3x und Legacy-node_auto_indexing mit benutzerdefinierten Lucene Analyzer

@Configuration 
@EnableNeo4jRepositories(basePackages = "com.example") 
@EnableTransactionManagement 
public class Neo4jTestConfig extends Neo4jConfiguration { 

    private static final String NEO4J_EMBEDDED_DATABASE_PATH_PROPERTY = "neo4j.embedded.database.path"; 

    @PostConstruct 
    public void init() { 
     Components.setDriver(new EmbeddedDriver(graphDatabaseService())); 

     EmbeddedDriver embeddedDriver = (EmbeddedDriver) Components.driver(); 
     GraphDatabaseService databaseService = embeddedDriver.getGraphDatabaseService(); 
     try (Transaction t = databaseService.beginTx()) { 
      Index<Node> autoIndex = databaseService.index().forNodes("node_auto_index"); 
      databaseService.index().setConfiguration(autoIndex, "type", "fulltext"); 
      databaseService.index().setConfiguration(autoIndex, "to_lower_case", "true"); 
      databaseService.index().setConfiguration(autoIndex, "analyzer", StandardAnalyzerV36.class.getName()); 
      t.success(); 
     } 
    } 

    public GraphDatabaseService graphDatabaseService() { 

     // @formatter:off 
     GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory() 
       .newEmbeddedDatabaseBuilder(new File(environment.getProperty(NEO4J_EMBEDDED_DATABASE_PATH_PROPERTY)))  
       .setConfig(GraphDatabaseSettings.node_keys_indexable, "name,description") 
       .setConfig(GraphDatabaseSettings.node_auto_indexing, "true"). 
       newGraphDatabase();   
     // @formatter:on   

     return graphDatabaseService; 
    } 

...

}

auch habe ich umgesetzt StandardAnalyzerV36:

public final class StandardAnalyzerV36 extends Analyzer { 

    public static final CharArraySet STOP_WORDS_SET = StopAnalyzer.ENGLISH_STOP_WORDS_SET; 

    @Override 
    protected TokenStreamComponents createComponents(String fieldName) { 

     final ClassicTokenizer src = new ClassicTokenizer(); 
     TokenStream tok = new StandardFilter(src); 
     tok = new StopFilter(new LowerCaseFilter(tok), STOP_WORDS_SET); 

     return new TokenStreamComponents(src, tok); 
    } 

    @Override 
    protected Reader initReader(String fieldName, Reader reader) { 
     return new HTMLStripCharFilter(reader); 
    } 
... 
} 

Gerade jetzt mein Test schlägt fehl, da der lo oks wie StandardAnalyzerV36 wird nicht korrekt auf den Index angewendet.

Was mache ich falsch und wie repariere ich es?

AKTUALISIERT Ich versuche Treiber zu konfigurieren mit ogm.properties:

driver=org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver 

dbms.auto_index.nodes.keys=name,description 
dbms.auto_index.nodes.enabled=true 

und config:

@Configuration 
@EnableNeo4jRepositories(basePackages = "com.example") 
@EnableTransactionManagement 
public class Neo4jTestConfig extends Neo4jConfiguration { 

    @Resource 
    private Environment environment; 

    @PostConstruct 
    public void init() { 
     EmbeddedDriver embeddedDriver = (EmbeddedDriver) Components.driver(); 
     GraphDatabaseService databaseService = embeddedDriver.getGraphDatabaseService(); 

     try (Transaction t = databaseService.beginTx()) { 
      Index<Node> autoIndex = databaseService.index().forNodes("node_auto_index"); 
      databaseService.index().setConfiguration(autoIndex, "type", "fulltext"); 
      databaseService.index().setConfiguration(autoIndex, "to_lower_case", "true"); 
      databaseService.index().setConfiguration(autoIndex, "analyzer", StandardAnalyzerV36.class.getName()); 
      t.success(); 
     } 
    } 

    @Override 
    public SessionFactory getSessionFactory() { 
     return new SessionFactory("com.example"); 
    } 

} 

, aber es funktioniert immer noch nicht.

Welche Einstellungen sollten in ogm.properties vorgenommen werden?

Antwort

2

Ich glaube nicht, dass Sie einen neuen Embedded-Treiber erstellen sollten: Components.setDriver(new EmbeddedDriver(graphDatabaseService()));

Stattdessen erhalten die GraphDatabaseService aus dem bereits konfigurierten Treiber und verwenden Sie das?

 EmbeddedDriver embeddedDriver = (EmbeddedDriver) Components.driver(); 
    GraphDatabaseService databaseService = embeddedDriver.getGraphDatabaseService(); 
    try (Transaction t = databaseService.beginTx()) { 
     Index<Node> autoIndex = databaseService.index().forNodes("node_auto_index"); 
     databaseService.index().setConfiguration(autoIndex, "type", "fulltext"); 
     databaseService.index().setConfiguration(autoIndex, "to_lower_case", "true"); 
     databaseService.index().setConfiguration(autoIndex, "analyzer", StandardAnalyzerV36.class.getName()); 
     t.success(); 
    } 

Wenn Sie den eingebetteten Treiber programmatisch konfigurieren möchten, dann können Sie es so in SDN einrichten

@Bean 
public Configuration getConfiguration() { 
    Configuration config = new Configuration(); 
    config 
     .driverConfiguration() 
     .setDriverClassName("org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver") 
     .setURI("file:///var/tmp/graph.db"); 
    return config; 
} 

@Bean 
public SessionFactory getSessionFactory() { 
    return new SessionFactory(getConfiguration(), <packages>); 
} 

oder wie dies nur mit dem OGM:

Configuration configuration = new Configuration() 
      .driverConfiguration() 
      .setDriverClassName("org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver") 
      .setURI(uri); 

Dann Verwenden Sie dieselbe Methode oben, um ein Handle für die zugrunde liegende Diagrammdatenbank zu erhalten.

aktualisieren: ogm.properties nicht dbms.auto_index.nodes.keys oder dbms.auto_index.nodes.enabled unterstützen. Diese müssen beim Erstellen des GraphDatabaseService konfiguriert werden. Dies ist mit der aktuellen Version der OGM nicht möglich. Siehe https://github.com/neo4j/neo4j-ogm/issues/134

+0

Ich habe 'ogm.properties' hinzugefügt, um embedded Laufwerk ohne' Components.setDriver (new EmbeddedDriver (graphDatabaseService())) zu konfigurieren; 'sieht aber aus wie' dbms.auto_index.nodes.keys', 'dbms .auto_index.nodes.keys' funktioniert nicht so. Was mache ich falsch ? – alexanoid