MarkLogic查询控制台运行RestAPI及zsearch模块优化咨询
方案专业点评
方案1:从日志提取请求复制到查询控制台运行
- 实现方式:不需要局限于
xdmp:http-post/xdmp.httpPost,可以直接调用zsearch模块的zsearch:get()函数,构造符合要求的$context和$params入参即可,比走HTTP调用少了网络开销,测试结果更精准。 - 性能分析合理性:直接测试Rest调用本身是合理的,如果要测业务逻辑性能,建议跳过HTTP层直接调用函数,避免网络、负载均衡等外部因素干扰测试结果;如果要端到端测完整请求链路,用HTTP调用的方式更贴近真实场景。
方案2:硬编码添加return:plan和return:metrics选项
修改zsearch:get()函数里的$paramMap构造逻辑即可,示例如下:
let $paramMap := map:new() =>zsearch:query-parameter($params,"q",false(),false(),(),(),()) =>zsearch:query-parameter($params,"category",false(),true(),("content","metadata","collections","permissions","properties","quality","metadata-values"),(),()) =>zsearch:query-parameter($params,"format",false(),false(),("json","xml"),(),()) =>zsearch:query-parameter($params,"start",false(),false(),(),(),xs:unsignedLong#1) =>zsearch:query-parameter($params,"pageLength",false(),false(),(),(),xs:unsignedLong#1) =>zsearch:query-parameter($params,"options",false(),false(),(),(),()) =>zsearch:query-parameter($params,"collection",false(),true(),(),(),()) =>zsearch:query-parameter($params,"directory",false(),false(),(),(),()) =>zsearch:query-parameter($params,"view",false(),true(),("none","results","metadata","facets","all"),(),()) =>zsearch:query-parameter($params,"txid",false(),false(),(),(),()) =>zsearch:query-parameter($params,"database",false(),false(),(),(),()) =>zsearch:query-parameter($params,"forest-name",false(),true(),(),(),()) =>zsearch:query-parameter($params,"transform",false(),false(),(),(),()) =>zsearch:query-parameter($params,"timestamp",false(),false(),(),(),()) =>zsearch:query-parameter($params,"trace",false(),true(),(),"http://marklogic.com/xdmp/privileges/rest-tracer",()) (: 新增添加指标和执行计划的参数 :) =>map:with("view", map:get($paramMap, "view") => ("plan", "metrics")) =>map:with("return-plan", fn:true()) =>map:with("return-metrics", fn:true())
search-model-query.xqy会自动识别上述参数返回执行计划和性能指标,不需要修改下游调用逻辑。
search-model-query.xqy相关问题解答 模块存放位置
该模块属于MarkLogic内置的REST API底层模块,存放在MarkLogic的Modules系统数据库中,你可以在查询控制台切换数据源到Modules数据库,直接查询路径/MarkLogic/rest-api/models/search-model-query.xqy查看源码。不建议直接修改内置模块添加日志,可以在zsearch:get()调用searchmodq:search-get()的前后添加xdmp:log()打印参数和执行时间即可。
为什么用search-model-query.xqy而非search:search
search-model-query.xqy是MarkLogic REST API搜索端点的底层封装,内置了所有REST搜索参数的解析、权限校验、响应格式转换、分页逻辑、transform调用等能力,直接调用可以省去自己实现这些逻辑的成本,本身不会额外发起REST API调用,和直接调用search:search的性能差异极小,你认为效率低属于误解。
迁移到
search:search的步骤 - 移除原有对
searchmodq、sut、eput三个REST相关模块的导入 - 保留原有的参数解析逻辑,把
$paramMap里的参数映射为search:search对应的入参:q参数对应search:search的第一个$query入参options参数对应第三个$options入参start、pageLength对应第四、第五个入参
- 手动实现原有REST模块内置的逻辑:结构化查询解析、结果格式转换、权限校验、transform调用、响应头设置等
- 替换
searchmodq:search-get()调用为search:search()调用,把返回结果传入原有的zsearch:compress()压缩逻辑即可
内容的提问来源于stack exchange,提问作者Tim Meagher
相关产品推荐
相关产品推荐

