我正在使用Java来查询Solr服务器,以查找在我感兴趣的一组已知ID中具有ID的结果。
我能想到的最好的方法是获得我感兴趣的这些结果是创建一个看起来像这样的长查询字符串:
q=(item_id:XXX33-3333 OR item_id:YYY42-3445 OR item_id:JFDE-3838)
在发出请求之前,我生成了这个字符串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大小。如果你使用的是Tomcat和maxPostSize
,请查看maxFormContentSize
。
从Solr 6.0开始,Solr中有一个maxBooleanClauses
配置 - 默认为1024。
我写了一个单元测试来确认和确认限制(使用Solr 5.3)。
在这里查看更多https://wiki.apache.org/solr/SolrConfigXml#The_Query_Section
FWIW有一个开放的Solr JIRA将其删除,以便将来可以删除https://issues.apache.org/jira/browse/SOLR-4586