评估 NumFound 时出现 OutOfMemory 异常

OutOfMemory exception when evaluating NumFound

我在我们的项目中实现了 Solr.net 搜索,目前索引中有 660k 文档(大小 ~185 Mb)。

不幸的是,solr 偶尔会抛出 OutOfMemory 异常:

Error searching for contacts System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. at System.Text.StringBuilder.ToString() at System.IO.StreamReader.ReadToEnd() at SolrNet.Impl.SolrConnection.ReadResponseToString(IHttpWebResponse response) in c:\prg\SolrNet\SolrNet\Impl\SolrConnection.cs:line 213 at SolrNet.Impl.SolrConnection.GetResponse(IHttpWebRequest request) in c:\prg\SolrNet\SolrNet\Impl\SolrConnection.cs:line 199 at SolrNet.Impl.SolrConnection.Get(String relativeUrl, IEnumerable'1 parameters) in c:\prg\SolrNet\SolrNet\Impl\SolrConnection.cs:line 149 at SolrNet.Impl.SolrQueryExecuter'1.Execute(ISolrQuery q, QueryOptions options) in c:\prg\SolrNet\SolrNet\Impl\SolrQueryExecuter.cs:line 672 at SolrNet.Impl.SolrBasicServer'1.Query(ISolrQuery query, QueryOptions options) in c:\prg\SolrNet\SolrNet\Impl\SolrBasicServer.cs:line 98 at SolrNet.Impl.SolrServer'1.Query(ISolrQuery query, QueryOptions options) in c:\prg\SolrNet\SolrNet\Impl\SolrServer.cs:line 49 at SolrNet.Impl.SolrServer`1.Query(ISolrQuery q) in c:\prg\SolrNet\SolrNet\Impl\SolrServer.cs:line 88 at SearchService.Search.SolrSearch.SearchCount(String queryString, Boolean exactSearch) in c:\Projects\SearchService\Search\SolrSearch.cs:line 240

但是代码很简单:

public ISolrOperations<ContactForSearch> SolrInstance
{
    get
    {
        if (!_initialized)
        {
            Startup.Init<ContactForSearch>(ConfigurationManager.AppSettings.Get("SolrPath"));
            _initialized = true;
        }

        return ServiceLocator.Current.GetInstance<ISolrOperations<ContactForSearch>>();
    }
}

public virtual int SearchCount(string queryString, bool exactSearch)
{
    return SolrInstance.Query(GetGeneralSearchQuery(queryString, exactSearch)).NumFound;
}

有些查询可能会返回数千个联系人,但我认为 NumFound 应该只获取计数?那么,我该如何解决这个问题呢? 预先感谢所有建议!

您似乎在使用 .NET 客户端。根据我的经验,当您使用 .NET 客户端执行 Solr 查询时,它将 return 来自 Solr 的整个文档,而不仅仅是您感兴趣的查询部分。您可以尝试将查询限制为 return 0 实际行,因为这仍然 return 正确的 NumFound 值。

例如:

return SolrInstance.Query(query, new QueryOptions{ Rows = 0 }).NumFound;