Xquery MarkLogic-REST API服务扩展-搜索提取选项

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

我在MarkLogic数据库中有以下JSON文档

我正在尝试编写一个自定义搜索扩展,以便返回完整的JSON段,并找到匹配项。如果在该段中未找到匹配项,则不应返回数组的其他段

在上一个线程的帮助下(供参考)

我了解了
搜索:搜索
模块的
选项

但是,当我使用该选项时,它将返回文档中的所有段,而不管哪个段实际具有匹配项

这是我的密码

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内部服务器
,说明我的扩展不存在。我将用我的
转换结果更新我的问题