获取包含文档中的搜索片段的节点

时间:2017-02-07 21:07:12

标签: marklogic marklogic-8

是否有办法获取包含搜索片段的节点,例如: -

我有一个示例xml doc

<pdf2xml>
  <page pageNo="1">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</page>
  <page pageNo="2">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</page>
  <page pageNo="3">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</page>
  <page pageNo="4">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</page>
</pdf2xml>

如何获取给定搜索结果的pageNo?我尝试了以下

search:snippet(fn:doc($uri), 
  cts:query(search:parse($q, $options)),  
    <transform-results apply="snippet" xmlns="http://marklogic.com/appservices/search">
      <per-match-tokens>30</per-match-tokens> 
      <max-matches>1000</max-matches> 
      <max-snippet-chars>2000</max-snippet-chars>
      <preferred-matches>
        <element name="page" ns=""/>
      </preferred-matches>
    </transform-results>)

这并没有给出所有的片段......什么是做我想做的事情的好方法?

2 个答案:

答案 0 :(得分:4)

包含匹配的节点的xpath位于search:match元素的path属性中。当我尝试上面的示例(在其中一个页面中替换值“abc”)时,我从搜索中获得以下响应:snippet:

<search:snippet xmlns:search="http://marklogic.com/appservices/search">
<search:match path="fn:doc("test.xml")/pdf2xml/page[1]">
<search:highlight>abc</search:highlight>
</search:match>
</search:snippet>

注意search:match元素中的path属性“fn:doc(”test.xml“)/ pdf2xml / page 1”。这告诉你哪个页面匹配。您可以通过将该节点传递给xdmp:unpath()来访问该节点。

您可以根据文档获取更多代码段或调整片段:Modifying Your Snippet Results

但是,您可能希望考虑将您的网页分成单独的较小文档,这样您就可以确定哪个文档匹配而不是大型pdf文档中的哪个页面。如果可能,较小的粒度文档可以更易于管理,并且更有效地进行搜索。

答案 1 :(得分:3)

查找文档中的所有片段,返回包含元素并突出显示它们可以使用cts:walk和cts:snippet

xquery version "1.0-ml";


let $content := <pdf2xml>
  <page pageNo="1">xxxxxxxxxxxxxx 1 xxxxxxxxx</page>
  <page pageNo="2">xxxxxxxxxxxxxx 2 xxxxx foo xxxxxxxx</page>
  <page pageNo="3">xxxxxxxxxxxxxxx 3 xxxxxxxxxxxxxxxxxxxxxxx</page>
  <page pageNo="4">xxxxxxxxxxxxxxxxx 4 xxxxxxxxxxx foo xxxxxxxxxx</page>
</pdf2xml>

let $q := cts:word-query("foo")

return <results> 
{cts:walk($content, $q , 
  <result>
    <original-node>{$cts:node/parent::*}</original-node>
    <highlighted-content>{cts:highlight($cts:node/parent::*, $q, <matched>{$cts:text}</matched>)}</highlighted-content>
  </result>
  )}
</results>

结果:

<results>
  <result>
    <original-node>
      <page pageNo="2">xxxxxxxxxxxxxx 2 xxxxx foo xxxxxxxx</page>
    </original-node>
    <highlighted-content>
      <page pageNo="2">xxxxxxxxxxxxxx 2 xxxxx <matched>foo</matched> xxxxxxxx</page>
    </highlighted-content>
  </result>
  <result>
    <original-node>
      <page pageNo="4">xxxxxxxxxxxxxxxxx 4 xxxxxxxxxxx foo xxxxxxxxxx</page>
    </original-node>
      <highlighted-content>
        <page pageNo="4">xxxxxxxxxxxxxxxxx 4 xxxxxxxxxxx <matched>foo</matched> xxxxxxxxxx</page>
      </highlighted-content>
    </result>
</results>

这可能不是您想要的,但我仍然提供它作为您可以操作结果的一些功能的示例(或者在示例中,通过搜索提取和突出显示内容或不)