Spring Data Neo4j - Cypher查询中的全文索引

时间:2013-11-09 05:07:37

标签: java spring cypher spring-data-neo4j full-text-indexing

我通过 findAllByQuery()存储库方法访问全文索引,它工作正常,但我无法通过分页参数,所以我正在尝试使用 LIMIT ,以下是我的测试:

案例1 - 工作正常但难以编码

@Query( "START n=node:searchName('name:*test*') return n" )
EndResult<SomeGraphObject> findByName()

案例2(从不工作),提供 term =“* test *”,抛出异常

@Query( "START n=node:searchName('name:{0}') return n" )
EndResult<SomeGraphObject> findByName(String term)

案例3(部分正常工作) - 在提供 luceneExpression =“name:* test *”时工作正常,但在 luceneExpression =时不起作用“name:* test test *”,我的意思是当查询字符串包含空格时不起作用。

@Query( "START n=node:searchName({0}) return n" )
EndResult<SomeGraphObject> findByName(String luceneExpression)

另一个问题是当我使用 findAllByQuery()存储库方法时,首次创建或查询时将创建索引 searchName 。但是当我使用Cypher查询而不创建索引 searchName 时,它会抛出“Index searchName 不存在”错误。

非常感谢任何帮助。

SomeGraphObject.java

@NodeEntity
public class SomeGraphObject {

    @GraphId Long id;

    @Indexed(indexName="searchName", indexType = IndexType.FULLTEXT)
    String name;

}

1 个答案:

答案 0 :(得分:0)

对于动态查询表达式,您应该只使用案例3代码。 空间不起作用的原因是因为在Lucene空间中意味着另一个表达式,但由于某种原因,neo4j要求在任何表达式前面的字段名称意味着您应该使用:
    name:*test name:test*
    name:(*test test*)

BTW我认为以“*”开头的查询在Lucene中是非法的,所以它有点奇怪。