现在,我使用这段代码根据从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
中。
在文档中,我可以在描述中看到这一点
选项来定义搜索语法并控制搜索。有关函数搜索:搜索,请参见$options的说明。请注意,您不能在搜索:snippet的transform-results选项上指定apply属性;要使用不同的代码段函数,可以使用search:search或search:resolve。
但在这里是:
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
和
查韦斯做了什么
会得到更高的
提前感谢!
发布于 2015-09-15 22:29:41
问题不在于将选项传递给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()
函数允许您提取匹配的文本,并返回封装在包含节点中的匹配项,并带有高亮标记。但是,为了允许搜索:片段提取正确的文本,传递给代码片段的cts:query()
应该匹配值的顺序。对于search:snippet
,cts:query
通常是调用search:parse
的结果。search:parse()
函数根据给定的选项解析查询文本,并返回适当的cts:query
XML。
https://stackoverflow.com/questions/32394802
复制相似问题