Можно ли переопределить Sitcore (ContentSearch) SeachMaxResults для Solr во время выполнения? - PullRequest
2 голосов
/ 20 марта 2019

В настоящее время я использую значение конфигурации по умолчанию:

<setting name="ContentSearch.SearchMaxResults" value="500" />

Мне нужно для конкретного запроса Solr (ContentSearch) вернуть все элементы с определенным идентификатором шаблона. Всего будет возвращено более 1200 наименований.

Я попытался использовать функцию подкачки для переопределения SearchMaxResults, вызвав запрос следующим образом:

var query = context.GetQueryable<SearchResultItem>().Filter(i => i["_template"].Equals(variantTemplateId));
query = query.Page(1, 1500);
var results = query.GetResults();

Однако я по-прежнему получаю только одну страницу из 500 элементов, поскольку размер страницы 1500 не переопределяет значение SearchMaxResults, равное 500.

Я действительно не хочу увеличивать SearchMaxResults для всех запросов, поскольку это будет иметь негативное влияние в целом на поиск. Было бы идеально, если бы я мог временно установить для этого параметра значение «» (неограниченное количество результатов), выполнить свой запрос и вернуть его к значениям по умолчанию - но я не вижу способа сделать это. Я также не могу использовать GetDescendants () для получения всех этих элементов, так как это отрицательно влияет на производительность сайта, даже если я делаю это только один раз и сохраняю результаты в кэше памяти.

Любое направление будет с благодарностью.

1 Ответ

1 голос
/ 20 марта 2019

Как вы говорите, хорошо, чтобы SearchMaxResults оставляло для reosanble низкое число, такое как 500. Когда вы знаете, что вам может потребоваться получить больше данных, вы можете выполнить несколько запросов в цикле, например, так:

int skip = 0;
const int chunkSize = 500;
bool fetchMore = true;
while (fetchMore) {
  var q = context.GetQueryable<MyModel>()
       .Filter(....)
       ...
       .Skip(skip).Take(chunkSize)
       .Select (d => new { d.field1, d.field2, ... })
       .GetResults();
  var cnt = 0;
  foreach (var doc in q.Hits) {
    // do stuff
    cnt ++;
  }
  skip += cnt;
  fetchMore = cnt == chunkSize;
}

Как уже отмечалось выше, я использовал метод Select, чтобы ограничить количество возвращаемых полей.Это определит поле fl Solr, чтобы вернуть только те поля, которые вам нужны.В противном случае будет использоваться fl=*,score, что приведет к отправке большого количества данных по сети, а десериализация может быть довольно тяжелой.(У меня есть отдельный пост по этому вопросу здесь: https://mikael.com/2019/01/optimize-sitecore-solr-queries/)

...