使用 HTTP POST 时,Solr 查询字符串是否有大小或期限限制?

2022-09-02 20:50:44

我正在使用Java来查询Solr服务器,以获取在我感兴趣的一组已知ID中具有ID的结果。

我能想到的获得我感兴趣的这些结果的最好方法是创建一个长查询字符串,如下所示:

q=(item_id:XXX33-3333 OR item_id:YYY42-3445 OR item_id:JFDE-3838)

在提出请求之前,我生成了这个字符串,并且我最终想要发出的请求中包含了超过1500个这样的ID。我正在使用HTTP POST进行这样的查询:queryString

        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查询中,我可以或一起的ID数量是否有限制?当我超过1000时,这可能失败还有其他原因吗?我做过实验,它在1024左右失败(我的ids几乎都是相同的长度),所以它似乎表明有一个字符或期限限制。

或者,如果有人对我如何以另一种更聪明的方式检索我正在寻找的项目有一个很好的建议,我很乐意听到它。我的备份解决方案只是查询Solr的所有项目,解析结果,并使用属于我感兴趣的集合的项目。我宁愿不这样做,因为数据源可能有成千上万的项目,而且效率低下。


答案 1

Solr方面没有限制 - 我们经常以类似的方式使用Solr,查询中有成千上万的ID。

您需要查看 servlet 容器(Tomcat、Jetty 等)的设置,并增加最大 POST 大小。查找您是否正在使用Tomcat以及是否正在使用Jetty。maxPostSizemaxFormContentSize


答案 2

从Solr 6.0开始,Solr中有一个配置 - 默认为1024。maxBooleanClauses

我写了一个单元测试来确认并确认限制(使用Solr 5.3)。

在此处查看更多 https://wiki.apache.org/solr/SolrConfigXml#The_Query_Section

FWIW有一个开放的Solr JIRA可以删除它,因此将来可能会将其删除 https://issues.apache.org/jira/browse/SOLR-4586


推荐