0

I'm moving from SDN 3 to SDN 4 and from Neo4j 2.3 to 3.0.1

I have a following Search Cypher query:

@Query(value = "START d=node:node_auto_index({autoIndexQuery}) MATCH (d:Decision) RETURN d")
Page<Decision> searchDecisions(@Param("autoIndexQuery") String autoIndexQuery, Pageable page);

Param autoIndexQuery in my test equals to following Lucene query:

(name:rdbma~0.33)^3 OR description:rdbma OR (name:mosyl~0.33)^3 OR description:mosyl

This is my Lucene dependencies:

    <!-- Lucene -->
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>5.5.0</version>
    </dependency>

Right now it fails with a following exception:

java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.lucene.search.BoostQuery.getField()
    at org.neo4j.index.impl.lucene.legacy.FullTxData.getFieldViaReflection(FullTxData.java:333)
    at org.neo4j.index.impl.lucene.legacy.FullTxData.extractTermField(FullTxData.java:314)
    at org.neo4j.index.impl.lucene.legacy.FullTxData.injectOrphans(FullTxData.java:273)
    at org.neo4j.index.impl.lucene.legacy.FullTxData.injectOrphans(FullTxData.java:268)
    at org.neo4j.index.impl.lucene.legacy.FullTxData.includeOrphans(FullTxData.java:255)
    at org.neo4j.index.impl.lucene.legacy.FullTxData.internalQuery(FullTxData.java:230)
    at org.neo4j.index.impl.lucene.legacy.FullTxData.query(FullTxData.java:215)
    at org.neo4j.index.impl.lucene.legacy.ExactTxData.query(ExactTxData.java:135)
    at org.neo4j.index.impl.lucene.legacy.TxDataHolder.query(TxDataHolder.java:53)
    at org.neo4j.index.impl.lucene.legacy.LuceneTransactionState.getRemovedIds(LuceneTransactionState.java:98)
    at org.neo4j.index.impl.lucene.legacy.LuceneLegacyIndex.query(LuceneLegacyIndex.java:238)
    at org.neo4j.index.impl.lucene.legacy.LuceneLegacyIndex.query(LuceneLegacyIndex.java:205)
    at org.neo4j.index.impl.lucene.legacy.LuceneLegacyIndex.query(LuceneLegacyIndex.java:217)
    at org.neo4j.kernel.impl.api.StateHandlingStatementOperations.nodeLegacyIndexQuery(StateHandlingStatementOperations.java:1440)

What am I doing wrong and how to fix it ?

UPDATED

This my test config:

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

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

    @Resource
    private Environment environment;

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

    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;
    }

    /**
     * Hook into the application lifecycle and register listeners that perform
     * behaviour across types of entities during this life cycle
     * 
     */
    @EventListener
    public void handleBeforeSaveEvent(BeforeSaveEvent event) {
        Object entity = event.getEntity();
        if (entity instanceof BaseEntity) {
            BaseEntity baseEntity = (BaseEntity) entity;
            if (baseEntity.getCreateDate() == null) {
                baseEntity.setCreateDate(new Date());
            } else {
                baseEntity.setUpdateDate(new Date());
            }
        }
    }

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

}

index configuration:

    @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();
        }
    }

and my custom Analyzer:

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);
    }   

}
brunoid
  • 2,121
  • 2
  • 12
  • 22

0 Answers0