我在MarkLogic DB中有以下JSON文档
我正在尝试编写自定义搜索扩展,以便我可以返回找到匹配项的完整段JSON。如果在该段中未找到匹配项,则不应返回阵列的其他段。
借助上一个帖子的帮助(MarkLogic - Extending the Search, return specific object node作为参考)
我了解了<extract-document-data>
模块的search:search
选项。
但是,当我使用该选项时,它会在文档中返回所有细分,无论哪个细分实际具有匹配项。
这是我的代码
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}
};
执行此操作但是,从文档中提取所有细分,而不仅仅是具有匹配项的细分。我无法为“仅匹配”类型的修饰符找到后续选项。
无论如何只提取匹配的“段”,而不是所有段
更新:尝试自定义代码段
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>
)
上述模块的部署工作正常。所有代码都在同一个文件中,名为show-search.xqy
但是当我尝试点击URL时,它会返回
无效请求:原因:扩展显示搜索不存在
如果我回到默认代码段选项,它可以正常工作。只有自定义代码段失败。
任何想法?
答案 0 :(得分:1)
我个人经常发现,当我的数据模型很复杂或者我想要一些特定的逻辑来将我的结果削减到我想要的数据点时,使用变换而不是提取文档数据会更直接
转换会将您的搜索结果作为文档处理,您可以编写一些XQuery(或JavaScript)进行导航,选择感兴趣的数据点,格式化响应并返回解析后的结果。
答案 1 :(得分:1)
如果要提取与查询匹配的属性,可以查看代码段:
http://docs.marklogic.com/guide/search-dev/search-api#id_65347
您可能需要编写自定义代码段来执行您想要的操作:
http://docs.marklogic.com/guide/search-dev/query-options#id_61707
希望有帮助,