Solr 有时无法解析查询,就好像它没有完全接收到它一样

Solr sometimes fails to parse the query as if it haven't fully received it

我正在 运行使用 Solr 进行一些测试。我 运行 一个脚本,用于从测试用例构建查询,然后使用 curl 发送到我的本地 Solr 实例。有时查询 运行 正常,但有时 相同的查询 失败并出现 Unexpected EOF 错误。相同意味着完全相同,我只是重复命令,而不是一个空列表,它显示了预期的结果。当我查看响应 XML 时出现错误,我确实在那里看到了 t运行cated JSON。磁盘上的 JSON 文件当然是完整的。小查询 运行 很好,问题开始出现在较长的查询中,似乎失败的次数多于成功的次数。我要测试的查询相当长且复杂。

可能是什么问题?

它是 Solr 8.2.0,在 Mac Mini 上的本地实例 OS X 10.11.6。我的发现集很小,我正在尝试找出复杂连接的逻辑。

我还记得我看到过类似的错误,即使我尝试使用 Solr 仪表板(即 http://<host>:8983/solr/#/<collection>/query)进行相对简单的查询时也是如此,只是我相当一致地得到它们(或者我只是没有想到重新尝试-发送它们)并将它们解释为我的查询语法有问题。

Update:失败的查询是2829字节,EOF发生在字符1400左右左右,总是同一个地方。我将 curl 作为 JSON 查询发送到 select 句柄;该集合基于具有一些自定义字段类型和字段的 default 配置,solrconfig.xml 未更改。

更新 2: 得到了日志条目,它是一样的,除了有一个堆栈跟踪。似乎有趣的是 JSON 总是 t运行 相同的大小:错误的 position 总是 1460.

2020-02-24 10:19:05.103 ERROR (qtp1357563986-23) [   x:proof]
o.a.s.s.HttpSolrCall null:org.noggit.JSONParser$ParseException: 
Unexpected EOF: char=(EOF),position=1460 AFTER='<redacted>'
    at org.noggit.JSONParser.err(JSONParser.java:452)
    at org.noggit.JSONParser.getMore(JSONParser.java:248)
    at org.noggit.JSONParser.readStringChars2(JSONParser.java:754)
    at org.noggit.JSONParser.readStringChars(JSONParser.java:734)
    at org.noggit.JSONParser.getStringChars(JSONParser.java:1206)
    at org.noggit.JSONParser.getString(JSONParser.java:1193)
    at org.noggit.ObjectBuilder.getString(ObjectBuilder.java:79)
    at org.noggit.ObjectBuilder.getVal(ObjectBuilder.java:51)
    at org.noggit.ObjectBuilder.getObject(ObjectBuilder.java:140)
    at org.noggit.ObjectBuilder.getVal(ObjectBuilder.java:63)
    at org.noggit.ObjectBuilder.getObject(ObjectBuilder.java:140)
    at org.noggit.ObjectBuilder.getVal(ObjectBuilder.java:63)
    at org.noggit.ObjectBuilder.getVal(ObjectBuilder.java:36)
    at org.noggit.ObjectBuilder.fromJSON(ObjectBuilder.java:32)
    at org.apache.solr.request.json.RequestUtil.mergeJSON(RequestUtil.java:266)
    at org.apache.solr.request.json.RequestUtil.processParams(RequestUtil.java:180)
    at org.apache.solr.util.SolrPluginUtils.setDefaults(SolrPluginUtils.java:165)
    at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:196)
    at org.apache.solr.core.SolrCore.execute(SolrCore.java:2578)
    at org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:780)
    at org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:566)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:423)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:350)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1602)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1711)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1347)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1678)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1249)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:152)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:335)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:505)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
    at org.eclipse.jetty.io.ChannelEndPoint.run(ChannelEndPoint.java:117)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:781)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:917)
    at java.lang.Thread.run(Thread.java:748)

发现问题:发送curl请求时没有content-type;一旦我将它设置为 application/json,一切就开始起作用了。