MarkLogic对变音不敏感的片段

时间:2015-09-04 09:40:06

标签: search xquery marklogic marklogic-8 search-snippet

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

上亮相
  

查韦斯做了一些事情

会得到一个高光

提前致谢!

1 个答案:

答案 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:snippetcts:query通常为a   调用search:parse的结果。 search:parse()函数解析   根据给定的选项查询文本并返回相应的   cts:query XML。