18

我正在使用 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 一起的 id 数量是否有限制?当我超过 1000 时,还有其他原因可能会失败吗?我已经尝试过了,它在 1024 左右失败(我的 id 长度几乎都一样),所以这似乎表明存在字符或期限限制。

或者,如果有人对我如何以另一种更智能的方式检索我正在寻找的项目有很好的建议,我很想听听。我的备份解决方案只是查询 Solr 的所有项目,解析结果,并使用属于我感兴趣的集合的那些。我不想这样做,因为数据源可能有数万个项目,这将是低效的。

4

2 回答 2

25

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

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

于 2013-04-25T02:49:06.323 回答
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

于 2016-04-28T12:17:06.683 回答