Получение переполнения стека при выполнении Linq to Sitecore Query
Я сталкиваюсь с интересной проблемой 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
приведет к переполнению стека.
2 ответа
Вы, вероятно, можете использовать массив местоположений и сделать содержимое.
locationPredicate.And(x=>locations.Contains(x["location"]));
Если вы получите большую жирную ошибку от этого, я опубликую некоторые лямбда-выражения, которые вы можете использовать вместо этого.
Lucene может обрабатывать только 1024 предложений одновременно.
Существует параметр Sitecore, называемый ContentSearch.LuceneQueryClauseCount, который должен заставить Lucene принимать любое количество предложений, которые вы определили в параметре, но, похоже, он не работает. Изменение значения этого параметра, похоже, ничего не делает во время операции поиска. Есть один способ заставить этот параметр быть прочитанным и заставить Lucene принимать более 1024 предложений OR одновременно. Увеличьте значение этого параметра и перед выполнением поиска запустите следующую строку кода:
BooleanQuery.MaxClauseCount = int.Parse(Sitecore.Configuration.Settings.GetSetting("ContentSearch.LuceneQueryClauseCount"));
Это позволяет вам отправить запрос с более чем 1024 предложениями, однако в какой-то момент Lucene все равно выдаст исключение StackruException. Чтобы обойти ограничение Lucene, вы должны разбить количество предложений OR с шагом 1024 и выполнить несколько поисков с подмножеством предложений OR каждый раз.