Solr 的 Sitecore (ContentSearch) SeachMaxResults 可以在运行时重新定义吗?
Can Sitecore (ContentSearch) SeachMaxResults for Solr be redefined at runtime?
目前我使用的是默认配置值:
<setting name="ContentSearch.SearchMaxResults" value="500" />
对于特定的 Solr (ContentSearch) 查询,我需要 return 特定 模板 ID 的所有项目。总 returned 将超过 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()
作为获取所有这些项目的方式,因为它会对站点性能产生负面影响,即使我只这样做一次并将结果存储在内存缓存中也是如此。
任何方向将不胜感激。
正如你所说,最好将 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
方法来限制 returned 字段的数量。这会将 fl
Solr 字段指定为 return 您需要的字段。否则 fl=*,score
将被使用并导致通过网络发送大量数据并且反序列化它可能非常繁重。 (我在这里有一个单独的 post:https://mikael.com/2019/01/optimize-sitecore-solr-queries/)
目前我使用的是默认配置值:
<setting name="ContentSearch.SearchMaxResults" value="500" />
对于特定的 Solr (ContentSearch) 查询,我需要 return 特定 模板 ID 的所有项目。总 returned 将超过 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()
作为获取所有这些项目的方式,因为它会对站点性能产生负面影响,即使我只这样做一次并将结果存储在内存缓存中也是如此。
任何方向将不胜感激。
正如你所说,最好将 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
方法来限制 returned 字段的数量。这会将 fl
Solr 字段指定为 return 您需要的字段。否则 fl=*,score
将被使用并导致通过网络发送大量数据并且反序列化它可能非常繁重。 (我在这里有一个单独的 post:https://mikael.com/2019/01/optimize-sitecore-solr-queries/)