目前,我正在使用这段代码生成片段,该代码基于我从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
中,我无法像在cts.jsonPropertyValueQuery
中那样传递diacritic-insensitive
选项。在文档中,我可以看到以下描述:
引用:
定义搜索语法和控制搜索的选项。有关函数search:search的$options的说明,请参见说明。请注意,在transform-results选项上无法指定apply属性与search:snippet一起使用;要使用不同的片段化函数,请改用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)
这是否意味着我不能传递其他选项给search:snippet?还是有选项可以做到这一点?
我正在使用“chávez”进行测试,它产生了结果,但只有包含精确匹配的文档才会生成正确的摘录,也就是说,文档
不会在“Chavez”上高亮显示,而Chavez did something
将高亮显示。Chávez did something
提前感谢!
<search:highlight>Chavez</search:highlight>
不是结果的一部分。这很可能是 MarkLogic 的一个 bug,因为它似乎与此函数的预期相反。作为一种解决方法,您可以考虑编写一个添加高亮后处理的函数,但这样做可能并不容易(考虑使用 NFD(分解),这使得在搜索术语和结果上删除变音符号以及使用普通的 XPath/XQuery 函数在结果中搜索变得容易)。 - Abel