Xquery MarkLogic-REST API服务扩展-搜索提取选项
我在MarkLogic数据库中有以下JSON文档 我正在尝试编写一个自定义搜索扩展,以便返回完整的JSON段,并找到匹配项。如果在该段中未找到匹配项,则不应返回数组的其他段 在上一个线程的帮助下(供参考) 我了解了Xquery MarkLogic-REST API服务扩展-搜索提取选项,xquery,marklogic,Xquery,Marklogic,我在MarkLogic数据库中有以下JSON文档 我正在尝试编写一个自定义搜索扩展,以便返回完整的JSON段,并找到匹配项。如果在该段中未找到匹配项,则不应返回数组的其他段 在上一个线程的帮助下(供参考) 我了解了搜索:搜索模块的选项 但是,当我使用该选项时,它将返回文档中的所有段,而不管哪个段实际具有匹配项 这是我的密码 declare function ext:get( $context as map:map, $params as map:map ) as document-n
搜索:搜索
模块的
选项
但是,当我使用该选项时,它将返回文档中的所有段,而不管哪个段实际具有匹配项
这是我的密码
declare
function ext:get(
$context as map:map,
$params as map:map
) as document-node()*
{
map:put($context, "output-types", "application/json"),
map:put($context, "output-status", (200, "OK")),
let $search-term := map:get($params, "searchTerm")
let $query := search:search($search-term,
<options xmlns="http://marklogic.com/appservices/search">
<extract-document-data>
<extract-path>/segments</extract-path>
</extract-document-data>
<return-facets>true</return-facets>
</options>
)
return document {$query}
};
声明
函数ext:get(
$context作为映射:映射,
$params作为映射:映射
)作为文档-node()*
{
map:put($context,“输出类型”,“应用程序/json”),
映射:put($context,“output status”,(200,“OK”),
让$search-term:=map:get($params,“searchTerm”)
let$query:=search:search($search-term,
/分段
真的
)
返回文档{$query}
};
但是,这样做会从文档中提取所有段,而不仅仅是具有匹配项的段。我无法找到“仅匹配”类型修改器的后续选项
是否只提取匹配的“段”,而不是所有段
本质上,我试图获取突出显示部分的原始json
更新:正在尝试自定义代码段
declare
function ext:my-snippet(
$result as node(),
$ctsquery as schema-element(cts:query),
$options as element(search:transform-results)?
) as element(search:snippet)
{
element search:snippet {
$result
}
};
let $query := search:search($search-term,
<options xmlns="http://marklogic.com/appservices/search">
<transform-results apply="my-snippet" ns="ext" at="/show-search.xqy">
<max-snippet-chars>150</max-snippet-chars>
<per-match-tokens>20</per-match-tokens>
</transform-results>
</options>
)
声明
函数ext:我的代码片段(
$result作为节点(),
$ctsquery作为模式元素(cts:query),
$options作为元素(搜索:转换结果)?
)作为元素(搜索:代码段)
{
元素搜索:代码段{
$result
}
};
let$query:=search:search($search-term,
150
20
)
上述模块的部署工作正常。所有代码都在同一个名为show search.xqy
的文件中,但是当我尝试点击URL时,它会返回
无效请求:原因:扩展显示搜索不存在
如果我回到默认的代码段选项,它就可以正常工作。仅在自定义代码段中失败
有什么想法吗?我个人经常发现,当我的数据模型很复杂,或者我想用一些特定的逻辑将结果缩减到我想要的数据点时,使用转换而不是提取文档数据更直接 转换将把搜索结果作为文档处理,您可以编写一些XQuery(或JavaScript)来导航、选择感兴趣的数据点、格式化响应并返回解析结果
我个人经常发现,当我的数据模型很复杂,或者我想用一些特定的逻辑将结果缩减到我想要的数据点时,使用转换而不是提取文档数据更直接 转换将把搜索结果作为文档处理,您可以编写一些XQuery(或JavaScript)来导航、选择感兴趣的数据点、格式化响应并返回解析结果
如果要提取与查询匹配的属性,可以查看代码片段: 您可能需要编写一个自定义代码段以执行所需操作:
希望这能有所帮助,如果要提取与查询匹配的属性,可以查看代码片段: 您可能需要编写一个自定义代码段以执行所需操作:
希望能有所帮助,您是否尝试过将选项中的searchable expression设置为文档根目录下的内容?另外,您是否尝试过使用search:highlight遍历匹配?另外,您是否考虑过自定义代码段函数?还是定制的装饰师?您是否尝试过将选项中的searchable expression设置为文档根目录下的内容?另外,您是否尝试过使用search:highlight遍历匹配?另外,您是否考虑过自定义代码段函数?还是定制的装饰师?嗨@ehennum谢谢你的回复。我现在正在调查自定义代码片段。添加
转换结果apply=“snippet”
有效。但是,当我尝试添加一个只返回$result
的自定义代码段时,它部署得很好,但返回一个500内部服务器
,说明我的扩展不存在。我将用我的转换结果更新我的问题
codeHi@ehennum谢谢你的回答。我现在正在调查自定义代码片段。添加转换结果apply=“snippet”
有效。但是,当我尝试添加一个只返回$result
的自定义代码段时,它部署得很好,但返回一个500内部服务器
,说明我的扩展不存在。我将用我的转换结果更新我的问题