我遇到了一个有趣的Linq to Sitecore问题。我有一个案例,我有一个人员目录和一个存储在Sitecore中的位置目录。我正在尝试编写一个搜索功能,可以让我搜索附近的人。为此添加皱纹是因为人们可以与多个位置相关联。
到目前为止,方法一直是寻找附近的地点,获取他们的身份,然后找到与这些地点相关联的所有人。
这看起来大致如下:
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
的调用将导致堆栈溢出。
答案 0 :(得分:0)
您可以使用locations数组并执行包含。
]
如果你从那个Ill帖子中得到一个很大的错误,你可以使用一些lambda表达式。
答案 1 :(得分:0)
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子句的子集执行多次搜索。