4

现在,我正在使用此代码生成片段,基于我从 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.

文档中,我可以在描述中看到这一点

用于定义搜索语法和控制搜索的选项。请参阅函数 search:search 的 $options 描述。请注意,您不能使用 search: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)

那么这是否意味着我不能将其他选项传递给 search:snippet?或者有没有办法做到这一点?

我正在使用它进行测试chávez并且它正在产生结果,但是仅针对包含完全匹配的文档正确生成片段,这意味着该文档

查韦斯做了什么

不会高调Chavez

查韦斯做了什么

将获得高光

提前致谢!

4

1 回答 1

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()函数允许您提取匹配文本并返回包含在包含节点中的匹配项,并带有高亮标记。但是,为了允许 search:snippet 提取正确的文本,cts:query()传递给代码段的 应该与值的序列匹配。对于search:snippet,cts:query通常是调用的结果search:parse。该search:parse()函数根据给定的选项解析查询文本并返回适当的 cts:queryXML。

于 2015-09-16T06:29:41.433 回答