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