【问题标题】:Getting Stack Overflow when performing Linq to Sitecore Query执行 Linq to Sitecore 查询时出现堆栈溢出
【发布时间】:2015-06-16 15:25:18
【问题描述】:

我遇到了一个有趣的 Linq to Sitecore 问题。我的情况是,我有一个人员目录和一个位置目录,这些目录都存储在 Sitecore 中。我正在尝试编写一个搜索功能,让我可以搜索附近的人。更令人担忧的是,人们可以与多个位置相关联。

到目前为止,方法是找到附近的位置,获取他们的 ID,然后找到与这些位置相关联的所有人员。

这大概是这样的:

var locations = GetNearbyLocations(lat, long, radius) // returns a list of short ID's 

var searchPredicate = PredicateBuilder.True<SearchResultItem>();
var locationsPredicate = PredicateBuilder.False<SearchResultItem>();

foreach (var location in locations)
{
    locationPredicate = locationPredicate.Or(x => x["location"] == location);
}

searchPredicate = searchPredicate.And(locationPredicate);
searchPredicate = searchPredicate.And(sri => sri.TemplateId == personTemplateId);

using (var context = index.CreateSearchContext())
{
    var peopleReults = context.GetQueryable<SearchResultItem>.Where(locationPredicate).GetResults();
}

如果GetNearbyLocations 返回一组相对较小的位置,则上述方法非常有用。一旦超过 150 个左右,对GetQuerable 的调用将导致堆栈溢出。

【问题讨论】:

  • 你能发布你收到的错误信息吗?
  • 这是一个标准的 System.StackOverflowException 错误。
  • 你能发布完整的错误堆栈吗?

标签: linq sitecore sitecore7 sitecore7.5


【解决方案1】:

您可能可以使用位置数组并执行包含。

 locationPredicate.And(x=>locations.Contains(x["location"]));

如果你从中得到一个大错误,我会发布一些你可以使用的 lambda 表达式。

【讨论】:

  • 仍然出现堆栈溢出。开始认为我在表达树的限制:stackoverflow.com/questions/10756191/…。可能需要重新审视索引的架构
  • 当您处理经纬度时,也许值得考虑进行空间搜索? - sitecorecoding.com/2014/11/…
  • 后端索引为 Coveo :(
  • 嗯,抱歉对 Coveo 了解不多,我觉得它像 Sitecore 7 search linq。
  • @ddysart Sitecore 7.5 引入了对多个搜索提供程序的支持,因此您可以为您的人员/位置创建一个新的 Lucene 索引(限制索引&lt;root&gt;),这应该允许您使用空间搜索针对 Lucene 索引的模块。
【解决方案2】:

Lucene 一次只能处理 1024 个子句。

有一个名为 ContentSearch.LuceneQueryClauseCount 的 Sitecore 设置应该强制 Lucene 接受您在设置中定义的任何数量的子句,但它似乎不起作用。在搜索操作期间更改此设置的值似乎没有任何作用。有一种方法可以强制读取此设置并强制 Lucene 一次接受超过 1024 个 OR 子句。增加这个设置的值,在执行搜索之前,运行这行代码:

BooleanQuery.MaxClauseCount = int.Parse(Sitecore.Configuration.Settings.GetSetting("ContentSearch.LuceneQueryClauseCount"));

这允许您提交包含超过 1024 个子句的查询,但是,在某些时候,Lucene 仍会抛出 StackOverflowException。为了绕过 Lucene 的限制,您必须以 1024 为增量分解 OR 子句的数量,并每次使用 OR 子句的子集执行多次搜索。

【讨论】:

  • 是的,我怀疑是这样的。我们有点回到了架构上的绘图板,因为我认为我们不会解决这个问题。谢谢!
  • 通常当你点击 maxClasuseCount 时会抛出一个TooManyClauses 异常,这就是我询问抛出错误消息的原因。无论如何,请参阅我关于为这些项目设置单独的 Lucene 索引的建议,或尝试将其移至 SQL Server:kevinrohling.wordpress.com/2010/07/08/…
猜你喜欢
  • 2023-04-11
  • 2021-05-28
  • 1970-01-01
  • 2010-11-01
  • 2019-05-18
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2017-07-02
相关资源
最近更新 更多