如何在Marklogic中返回过滤结果集?

时间:2012-05-10 12:39:05

标签: xml search xquery marklogic

考虑以下xml: -

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
</catalog>

现在,我想针对此文档运行搜索查询,并希望返回已过滤的结果集(例如作者姓名)。

一种方法是: -

xquery version "1.0-ml";
import module namespace search="http://marklogic.com/appservices/search" 
at "/Marklogic/appservices/search/search.xqy";

declare variable $options:=
<options xmlns="http://marklogic.com/appservices/search">
<transform-results apply="raw"/>
</options>;

for $x in search:search("", $options)/search:result
return $x//author/text()

但是search:search API首先将整个结果缓存到其缓存中,然后我们找到了 xpath 所需的节点。我不想要这个。我希望search:search API仅返回所需的元素,以便整个结果集不会缓存在marklogic服务器中。任何人都可以告诉我,我怎样才能在Marklogic中实现这一目标?

3 个答案:

答案 0 :(得分:1)

据我所知,search:search函数实际上没有自己的缓存。您可能更乐意使用search:parsesearch:resolve-nodes,但XQuery评估程序仍会将XML带入内存以提取作者文本。

远离搜索API,您可以在author上创建范围索引,并使用cts:element-values直接从索引中获取其值。

答案 1 :(得分:0)

Puneet,如果您使用的是MarkLogic 5.0版,则可以配置一个称为“元数据片段”的内容,以便只获取您希望取代默认代码段的元素。

以下是配置示例:

<options xmlns="http://marklogic.com/appservices/search">
    <transform-results  apply="metadata-snippet">
        <preferred-elements>
            <element name='ordinal' ns='http://marklogic.com/ns'/>
        </preferred-elements>
    </transform-results>
</options>

另一个:

<options xmlns="http://marklogic.com/appservices/search">
    <transform-results  apply="metadata-snippet">
        <preferred-elements>
            <element name='author' ns=''/>
            <element name='title' ns=''/>
        </preferred-elements>
    </transform-results>
</options>

答案 2 :(得分:0)

使用Cts:搜索而不是搜索:搜索是否需要非常小的结果。

xquery version "1.0-ml";
import module namespace search="http://marklogic.com/appservices/search" 
 at "/Marklogic/appservices/search/search.xqy";

  declare variable $options:=
    <options xmlns="http://marklogic.com/appservices/search">
     <grammar xmlns="http://marklogic.com/appservices/search">
      <quotation>"</quotation>
       <implicit>
     <cts:and-query strength="20" xmlns:cts="http://marklogic.com/cts"/>
      </implicit>
     <starter strength="30" apply="grouping" delimiter=")">(</starter>
      <starter strength="40" apply="prefix" element="cts:not-query">- </starter>
  <joiner strength="10" apply="infix" element="cts:or-query" 
  tokenize="word">OR</joiner>
 <joiner strength="20" apply="infix" element="cts:and-query" 
  tokenize="word">AND</joiner>
 <joiner strength="30" apply="infix" element="cts:near-query" 
  tokenize="word">NEAR</joiner>
 <joiner strength="30" apply="near2" element="cts:near-query">NEAR/</joiner>
 <joiner strength="50" apply="constraint">:</joiner>
 <joiner strength="50" apply="constraint" compare="LT"
  tokenize="word">LT</joiner>
 <joiner strength="50" apply="constraint" compare="LE" 
  tokenize="word">LE</joiner>
 <joiner strength="50" apply="constraint" compare="GT" 
  tokenize="word">GT</joiner>
 <joiner strength="50" apply="constraint" compare="GE" 
  tokenize="word">GE</joiner>
 <joiner strength="50" apply="constraint" compare="NE" 
  tokenize="word">NE</joiner>
       </grammar>
       <transform-results apply="raw"/>
    </options>;

 let $query := cts:query(cts:parse("in-depth look",$options))
  let $searchresult := cts:search(fn:doc()//book,$query)
  for $each in $searchresult 
    return $each/author

这会给你一个比搜索更细微的结果:搜索应该避免使用搜索:搜索并通过这条路线。这样可以提供更大的灵活性和更轻薄的结果。