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

mat*_*990 13 java solr http-post

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

我能想到的最好的方法是获得我感兴趣的这些结果是创建一个看起来像这样的长查询字符串:

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

queryString在发出请求之前,我生成了这个String,并且我最终想要的请求中包含超过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);
Run Code Online (Sandbox Code Playgroud)

如果我将查询限制为前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 ,解析结果,并使用属于我感兴趣的集合的那些.我宁愿不这样做,因为数据源可能有数万个项目,而且效率低下.

nik*_*500 17

Solr方面没有限制 - 我们经常以类似的方式使用Solr,查询中包含数万个ID.

您需要查看servlet容器(Tomcat,Jetty等)的设置并增加最大POST大小.查看maxPostSize您是否使用Tomcat以及maxFormContentSize是否使用Jetty.


kel*_*yfj 5

从 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