我已在我们的项目中实施了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
应该只计算?那么,我该如何解决这个问题呢?
提前感谢所有建议!
答案 0 :(得分:2)
看起来您正在使用.NET客户端。根据我的经验,当您使用.NET客户端执行Solr查询时,它将从Solr返回整个文档,而不仅仅是您感兴趣的查询位。您可以尝试将查询限制为返回0实际行这应该仍然返回正确的NumFound值。
例如:
return SolrInstance.Query(query, new QueryOptions{ Rows = 0 }).NumFound;