Java 如何从Neo4j调整lucene maxClauseCount?

Java 如何从Neo4j调整lucene maxClauseCount?,java,performance,lucene,neo4j,cypher,Java,Performance,Lucene,Neo4j,Cypher,以下是我们针对“按ID查找”服务的密码: START n=node:PATIENTS('MEMBER_PLAN_ID:(1 2)') return n 其中12是传递的ID。当我们传递大约2000个ID时,会发生以下错误: java.lang.RuntimeException: org.apache.lucene.queryParser.ParseException: Cannot parse 'MEMBER_PLAN_ID:(1 2)': too many boolean clauses

以下是我们针对“按ID查找”服务的密码:

START n=node:PATIENTS('MEMBER_PLAN_ID:(1 2)') return n
其中12是传递的ID。当我们传递大约2000个ID时,会发生以下错误:

java.lang.RuntimeException: org.apache.lucene.queryParser.ParseException: Cannot parse 'MEMBER_PLAN_ID:(1 2)': too many boolean clauses
        at org.neo4j.index.impl.lucene.IndexType.query(IndexType.java:304)
        at org.neo4j.index.impl.lucene.LuceneIndex.query(LuceneIndex.java:227)
        at org.neo4j.index.impl.lucene.LuceneIndex.query(LuceneIndex.java:238)
        at org.neo4j.cypher.internal.spi.gdsimpl.GDSBackedQueryContext$$anon$1.indexQuery(GDSBackedQueryContext.scala:87)
        at org.neo4j.cypher.internal.executionplan.builders.IndexQueryBuilder$$anonfun$getNodeGetter$2.apply(IndexQueryBuilder.scala:83)
        at org.neo4j.cypher.internal.executionplan.builders.IndexQueryBuilder$$anonfun$getNodeGetter$2.apply(IndexQueryBuilder.scala:81)
        at org.neo4j.cypher.internal.pipes.StartPipe$$anonfun$internalCreateResults$1.apply(StartPipe.scala:36)
        at org.neo4j.cypher.internal.pipes.StartPipe$$anonfun$internalCreateResults$1.apply(StartPipe.scala:35)
        at scala.collection.Iterator$$anon$13.__AW_hasNext(Iterator.scala:371)
        at scala.collection.Iterator$$anon$13.hasNext(Iterator.scala)
        at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply$mcZ$sp(ClosingIterator.scala:36)
        at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply(ClosingIterator.scala:35)
        at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply(ClosingIterator.scala:35)
        at org.neo4j.cypher.internal.ClosingIterator.failIfThrows(ClosingIterator.scala:86)
        at org.neo4j.cypher.internal.ClosingIterator.hasNext(ClosingIterator.scala:35)
        at org.neo4j.cypher.PipeExecutionResult.hasNext(PipeExecutionResult.scala:157)
        at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327)
        at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327)
        at scala.collection.convert.Wrappers$IteratorWrapper.hasNext(Wrappers.scala:29)
        at org.neo4j.cypher.PipeExecutionResult$$anon$1.hasNext(PipeExecutionResult.scala:73)
        at net.ahm.graph.dao.PatientDAO.__AW_findPatients(PatientDAO.java:376)


Caused by: org.apache.lucene.queryParser.ParseException: Cannot parse 'MEMBER_PLAN_ID:(1 2)': too many boolean clauses
        at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:221)
        at org.neo4j.index.impl.lucene.IndexType.query(IndexType.java:300)
        ... 38 more
Caused by: org.apache.lucene.search.BooleanQuery$TooManyClauses: maxClauseCount is set to 1024
        at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:136)
        at org.apache.lucene.queryParser.QueryParser.getBooleanQuery(QueryParser.java:958)
        at org.apache.lucene.queryParser.QueryParser.getBooleanQuery(QueryParser.java:933)
        at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1281)
        at org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1323)
        at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1245)
        at org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1234)
        at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:206)
        ... 39 more
我们在堆栈跟踪中看到:maxClauseCount设置为1024

在使用Cypher时,有没有办法从Neo4j配置此限制

试试这个(未测试):


但是,如果我将这一行添加到我们的服务中,则一切正常:

BooleanQuery.setMaxClauseCount(20000);

我们做了一些负载测试,其中1000个并发用户使用10000个ID访问该服务。之后没有看到服务崩溃/任何意外的性能问题。

它不起作用:(我们使用的是Neo 1.9.3,它使用Lucene 3.6.2Good来了解。我将把它留给后人。这可能是禁止的。您的用例是什么?外部系统根据规则选择一组患者。然后它从neo4j中查询关于这些患者的某些信息,一次往返。如果您不使用基于Java的Cypher,则更禁止,我想。我是Neo4j的新手。我唯一的要求是在一次往返中获取多个患者的信息。我们在传统的Oracle服务中有一个sql中的错误。您可能会遇到其他问题,甚至更高,但如果3000对于您的所有用例来说都足够好,那么您可能就可以了。您的患者规则可以为您提供无限数量的患者吗?如果不能整个图形都在内存中,也就是说,我们有一个足够大的堆…lucene还能爆炸吗?我想你在为自己铺路——至少我从未尝试过。:)我也有一种不好的感觉:)
BooleanQuery.setMaxClauseCount(20000);