评估NumFound

时间:2016-01-07 22:00:10

标签: c# out-of-memory solr.net

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

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

  

搜索联系人时出错System.OutOfMemoryException:异常   类型'System.OutOfMemoryException'被抛出。在   System.Text.StringBuilder.ToString()at   System.IO.StreamReader.ReadToEnd()at   SolrNet.Impl.SolrConnection.ReadResponseToString(IHttpWebResponse   响应)在c:\ prg \ SolrNet \ SolrNet \ Impl \ SolrConnection.cs:第213行   在SolrNet.Impl.SolrConnection.GetResponse(IHttpWebRequest request)中   c:\ prg \ SolrNet \ SolrNet \ Impl \ SolrConnection.cs:第199行   SolrNet.Impl.SolrConnection.Get(String relativeUrl,IEnumerable'1   参数)在c:\ prg \ SolrNet \ SolrNet \ Impl \ SolrConnection.cs:第149行   在SolrNet.Impl.SolrQueryExecuter'1.Execute(ISolrQuery q,QueryOptions   选项)在c:\ prg \ SolrNet \ SolrNet \ Impl \ SolrQueryExecuter.cs:第672行   在SolrNet.Impl.SolrBasicServer'1.Query(ISolrQuery查询,QueryOptions   选项)在c:\ prg \ SolrNet \ SolrNet \ Impl \ SolrBasicServer.cs:第98行at   SolrNet.Impl.SolrServer'1.Query(ISolrQuery查询,QueryOptions   选项)在c:\ prg \ SolrNet \ SolrNet \ Impl \ SolrServer.cs中:第49行at   SolrNet.Impl.SolrServer`1.Query(ISolrQuery q)in   c:\ prg \ SolrNet \ SolrNet \ Impl \ SolrServer.cs:第88行at   SearchService.Search.SolrSearch.SearchCount(String queryString,   布尔精确搜索)   c:\ Projects \ SearchService \ Search \ SolrSearch.cs:第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应该只计算?那么,我该如何解决这个问题呢? 提前感谢所有建议!

1 个答案:

答案 0 :(得分:2)

看起来您正在使用.NET客户端。根据我的经验,当您使用.NET客户端执行Solr查询时,它将从Solr返回整个文档,而不仅仅是您感兴趣的查询位。您可以尝试将查询限制为返回0实际行这应该仍然返回正确的NumFound值。

例如:

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