获取文档中包含搜索片段的节点
Gets Nodes containing the Search snippet in a document
有没有办法获取包含搜索片段的节点,例如:-
我有一个示例 xml 文档
<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>)
这也没有给出所有的片段......做我想做的事情的好方法是什么?
包含匹配项的节点的 xpath 在 search:match 元素的路径属性中。当我尝试上面的示例时(在其中一个页面中替换值 "abc"),我从 search: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 元素中的路径属性 "fn:doc("test.xml")/pdf2xml/page1"。这会告诉您哪个页面匹配。您可以通过将节点传递给 xdmp:unpath() 来访问该节点。
您可以获得更多代码片段或按照文档调整代码片段:Modifying Your Snippet Results
但是,您可能想要考虑将您的页面拆分成单独的较小文档,这样您就可以确定哪个文档匹配,而不是大型 pdf 文档中的哪个页面。如果可能,更小粒度的文档可以更易于管理和更有效地搜索。
查找文档中的所有片段、返回包含元素并突出显示它们可以使用 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>
这可能不是您想要的,但我仍然将其作为示例提供,以说明您可以使用的一些功能来操纵结果(或者在示例中,提取和突出显示内容作为结果是否搜索)
有没有办法获取包含搜索片段的节点,例如:-
我有一个示例 xml 文档
<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>)
这也没有给出所有的片段......做我想做的事情的好方法是什么?
包含匹配项的节点的 xpath 在 search:match 元素的路径属性中。当我尝试上面的示例时(在其中一个页面中替换值 "abc"),我从 search: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 元素中的路径属性 "fn:doc("test.xml")/pdf2xml/page1"。这会告诉您哪个页面匹配。您可以通过将节点传递给 xdmp:unpath() 来访问该节点。
您可以获得更多代码片段或按照文档调整代码片段:Modifying Your Snippet Results
但是,您可能想要考虑将您的页面拆分成单独的较小文档,这样您就可以确定哪个文档匹配,而不是大型 pdf 文档中的哪个页面。如果可能,更小粒度的文档可以更易于管理和更有效地搜索。
查找文档中的所有片段、返回包含元素并突出显示它们可以使用 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>
这可能不是您想要的,但我仍然将其作为示例提供,以说明您可以使用的一些功能来操纵结果(或者在示例中,提取和突出显示内容作为结果是否搜索)