c# - 可以在运行时重新定义 Solr 的 Sitecore (ContentSearch) SeachMaxResults 吗?
问题描述
目前我使用的默认配置值是:
<setting name="ContentSearch.SearchMaxResults" value="500" />
对于特定的 Solr (ContentSearch) 查询,我需要返回特定Template ID的所有项目。退回的总数量将超过 1200 件。
我尝试使用分页功能通过调用如下查询来覆盖SearchMaxResults :
var query = context.GetQueryable<SearchResultItem>().Filter(i => i["_template"].Equals(variantTemplateId));
query = query.Page(1, 1500);
var results = query.GetResults();
但是,我仍然只收到 500 个项目的单页,因为 1500 页面大小不会覆盖 500 的SearchMaxResults值。
我真的不想为所有查询增加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
方法来限制返回的字段数。这将指定fl
Solr 字段以仅返回您需要的字段。否则fl=*,score
将被使用并导致通过网络发送大量数据并且反序列化它可能非常繁重。(我在这里有一个单独的帖子:https ://mikael.com/2019/01/optimize-sitecore-solr-queries/ )
推荐阅读
- python - ValueError: y 应该是一维数组,得到一个形状为 (191584, 2) 的数组
- coq - 如何在 Coq 中不使用自动化策略来证明这个 DeMorgan 定律?
- c# - ASP.Net Core:更改密码时数据库连接失败,但重新启动应用程序时可以工作
- python - 在 python 请求模块时采用 1 个位置参数但 2 个错误
- angular - 在 mac 上检测 cmd + c 以在 Angular 应用程序中进行复制
- blazor - Blazor - 如何禁用对未使用的帐户页面的访问
- excel - 如何确定自由形状是开放轮廓还是封闭轮廓?
- r - 个体患者数据 (ipd) 荟萃分析
- discord.py - 不和谐狙击编辑的消息不起作用
- python - 如何将一行代码转换为 for in 循环?