运行具有大量过滤的 Solr Query 时出现 SocketException

Posted

技术标签:

【中文标题】运行具有大量过滤的 Solr Query 时出现 SocketException【英文标题】:SocketException while running Solr Query with lots of filtering 【发布时间】:2013-04-03 13:05:15 【问题描述】:

我正在尝试对我的本地 solr 服务器(单实例)运行查询。 我还在为 id 添加过滤器。 因此,如果有 10000 个 id,我会创建 10 个过滤查询,每个查询由 1000 个 id 组成。

过滤查询如下所示:

"id:(1 2 3 n)" 

我也在使用 Solrj,所以它是这样的:

query.addFilterQuery("id:(1 2 3 n)");

但是在某个阈值之后(5 分钟前是 1000,现在大约是 800),我开始收到异常:

org.apache.solr.client.solrj.SolrServerException: No live SolrServers available to handle this request
    Caused by: org.apache.solr.client.solrj.SolrServerException: IOException occured when talking to server at: http://localhost:8080/solr
        at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:416)
        at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:181)
        at org.apache.solr.client.solrj.impl.LBHttpSolrServer.request(LBHttpSolrServer.java:447)
        ... 37 more
    Caused by: java.net.SocketException: Software caused connection abort: recv failed

我搜索了一下,但只发现了 maxBoolean 查询,这可能不是我的情况

【问题讨论】:

我找到了解决方案。事实证明,默认情况下 Solrj 使用 GET 而不是 POST。修复的简单方法是使用 server.query(query, SolrRequest.METHOD.POST)。 【参考方案1】:

是的,伊戈尔, 你是对的。 默认情况下,Solrj 使用 GET 而不是 POST。 所以你必须使用 server.query(query, SolrRequest.METHOD.POST)。

【讨论】:

以上是关于运行具有大量过滤的 Solr Query 时出现 SocketException的主要内容,如果未能解决你的问题,请参考以下文章

尝试运行 Google Speech Recognition java 示例时出现“需要 query.json 的路径”错误

你可以使用 POST 在 Solr (/select) 中运行查询吗

滚动具有大量单元格(250,000 或更多)的两种方式滚动 UICollectionView 时出现可见滞后

自定义授权过滤器在运行时出现异常

处理大型数据集时出现内存不足错误

“过滤”急切加载的数据时出现问题