现在,我正在使用此代码生成代码段,基于我从MarkLogic搜索获得的JSON文档。
xquery version "1.0-ml";
module namespace searchlib="http://ihs.com/lib/searchlib";
import module namespace search="http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";
declare function searchlib:get-snippet($docc,$words) {
let $doc:= json:transform-from-json($docc)
let $squery := search:parse($words)
let $result := <result>{search:snippet($doc,$squery,
<transform-results apply="snippet" xmlns="http://marklogic.com/appservices/search">
<max-snippet-chars>255</max-snippet-chars>
</transform-results>)}</result>
return $result//search:match
};
执行搜索时我正在使用:
cts.jsonPropertyValueQuery(fieldname, values,
['case-insensitive', 'diacritic-insensitive'])
因此,搜索对变音不敏感并产生良好的效果,但在search:snippet
中,我无法像diacritic-insensitive
中那样传递cts.jsonPropertyValueQuery
选项。
在documentation我可以在说明中看到这个
用于定义搜索语法和控制搜索的选项。请参阅功能搜索的$ options说明:search。请注意,您无法使用search:snippet在transform-results选项中指定apply属性;要使用其他代码段功能,请使用搜索:搜索或搜索:解决。
但在这里它是:
search:snippet(
$result as node(),
$cts-query as schema-element(cts:query),
[$options as element(search:transform-results)?]
) as element(search:snippet)
这是否意味着我无法通过其他选项进行搜索:片段?或者可以选择这样做吗?
我正在使用chávez
对其进行测试,并且正在生成结果,但仅对包含完全匹配的文档正确生成代码段,这意味着该文档
查韦斯做了一些事
不会在Chavez
和
查韦斯做了一些事情
会得到一个高光
提前致谢!
答案 0 :(得分:2)
问题在于没有将选项传递给search:snippet
,而是传递给search:parse
xquery version "1.0-ml";
module namespace searchlib="http://ihs.com/lib/searchlib";
import module namespace search="http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";
declare function searchlib:get-snippet($docc,$words) {
let $doc:= json:transform-from-json($docc)
let $squery := search:parse($words,
<options xmlns="http://marklogic.com/appservices/search">
<term>
<term-option>case-insensitive</term-option>
<term-option>diacritic-insensitive</term-option>
</term>
</options>, "cts:query")
let $result := <result>{search:snippet($doc,$squery,
<transform-results apply="snippet" xmlns="http://marklogic.com/appservices/search">
<max-snippet-chars>255</max-snippet-chars>
</transform-results>)}</result>
return $result//search:match
};
传递
<term-option>diacritic-insensitive</term-option>
到search:parse
让它发挥作用。
以下是MarkLogic的解释:
search:snippet()
功能允许您提取匹配的文本和 返回包含在包含节点中的匹配项,并带有高亮显示 标记。但是,要允许搜索:snippet提取正确 文本,传递给代码段的cts:query()
应该匹配 价值序列。对于search:snippet
,cts:query
通常为a 调用search:parse
的结果。search:parse()
函数解析 根据给定的选项查询文本并返回相应的cts:query
XML。