我通过 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;
}
答案 0 :(得分:0)
对于动态查询表达式,您应该只使用案例3代码。
空间不起作用的原因是因为在Lucene空间中意味着另一个表达式,但由于某种原因,neo4j要求在任何表达式前面的字段名称意味着您应该使用:
name:*test name:test*
name:(*test test*)
BTW我认为以“*”开头的查询在Lucene中是非法的,所以它有点奇怪。