是否有办法获取包含搜索片段的节点,例如: -
我有一个示例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>)
这并没有给出所有的片段......什么是做我想做的事情的好方法?
答案 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>
这可能不是您想要的,但我仍然提供它作为您可以操作结果的一些功能的示例(或者在示例中,通过搜索提取和突出显示内容或不)