使用HTTP POST时,SOLR查询字符串是否有大小或术语限制?
我正在使用Java来查询SOLR服务器,以查找在我感兴趣的一组已知ID中具有ID的结果。
我能想到的最好的方法是获得我感兴趣的这些结果是创建一个看起来像这样的长查询字符串:
q=(item_id:XXX33-3333 OR item_id:YYY42-3445 OR item_id:JFDE-3838)
在发出请求之前,我生成了这个String, queryString
,并且我最终想要在请求中包含超过1500个这样的id。 我正在使用HTTP POST来进行查询:
HttpPost post = new HttpPost(url); post.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); StringEntity entity = new StringEntity(queryString, "UTF-8"); entity.setContentType("application/x-www-form-urlencoded; charset=utf-8"); post.setEntity(entity); HttpClient client = new DefaultHttpClient(); HttpResponse response = client.execute(post);
如果我将查询限制为只有前1000个ID,它会成功,我会按照我的预期得到结果。 但是,如果我将查询增加到包含我真正感兴趣的所有1500,我会得到一个HTTP 400响应代码,其中包含以下错误:
HTTP/1.1 400 org.apache.lucene.queryParser.ParseException: Cannot parse '[my query here...]
在SOLR查询中,我可以一起使用OR的数量是否有限制? 当我超过1000时,还有另一个原因可能会失败吗? 我已经进行了实验,它在1024左右失败了(我的ID几乎都是相同的长度)所以它似乎暗示有一个字符或术语限制。
或者,如果有人对如何以另一种更智能的方式检索我正在寻找的物品有一个很好的建议,我很乐意听到它。 我的备份解决方案只是查询所有项目的SOLR,解析结果,并使用属于我感兴趣的集合的那些。我宁愿不这样做,因为数据源可能有数万个项目,而且效率低下。
Solr方面没有限制 – 我们经常以类似的方式使用Solr,查询中包含数万个ID。
您需要查看servlet容器(Tomcat,Jetty等)的设置并增加最大POST大小。 如果您使用的是Jetty,请查看maxPostSize
如果您使用的是Tomcat和maxFormContentSize
。
从Solr 6.0开始,Solr中有一个maxBooleanClauses
配置 – 默认为1024。
我写了一个unit testing来确认和确认限制(使用Solr 5.3)。
在此处查看更多信息https://wiki.apache.org/solr/SolrConfigXml#The_Query_Section
FWIW有一个开放的Solr JIRA将其删除,以便将来删除https://issues.apache.org/jira/browse/SOLR-4586
- Java httpPost成.aspforms
- HttpPost – >重定向 – >所需响应的位置或主体
- 从Java中的HTTP POST请求中读取JSON消息
- GWT:如何使用JSON发送POST跨域请求
- 使用Java URLConnection进行Cookie管理
- Android:无法发送httppost
- HttpURLConnection即使在setDoOutput(true)之后执行get请求,setRequestMethod(“POST”)setRequestProperty(“Content”
- 使用android volley库发送JSONArray POST请求
- 使用JSON对象作为有效负载对REST API的POST请求