可以在运行时重新定义Sitcore(ContentSearch)SeachMaxResults for Solr吗?

时间:2019-03-20 01:47:55

标签: c# solr sitecore sitecore8

当前我正在使用默认配置值:

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

对于特定的Solr(ContentSearch)查询,我需要返回特定模板ID的所有项目。返回的总数将超过1200个项目。

我尝试使用分页功能通过如下查询来覆盖SearchMaxResults:

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

但是,由于1500页大小不会覆盖SearchMaxResults值500,我仍然只收到500个项目的一页。

我真的不想为所有查询增加SearchMaxResults,因为这将对搜索产生总体负面影响。理想的情况是,我可以暂时将此参数设置为“”(无限结果),运行查询,并将其重置为默认值-但我看不到能够做到这一点的方法。我也不能使用GetDescendants()来获取所有这些项目,因为它只会对站点性能产生负面影响,即使我只执行一次并将结果存储在Memory Cache中也是如此。

任何方向将不胜感激。

1 个答案:

答案 0 :(得分:1)

正如您所说,最好将SearchMaxResults保持在较小的整数,例如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/