评估 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;
我在我们的项目中实现了 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;