2

考虑以下 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:searchAPI 首先将整个结果缓存在其缓存中,然后我们使用xpath找到我们想要的节点。我不想要这个。我希望search:searchAPI 只返回所需的元素,以便整个结果集不会缓存在marklogic服务器中。谁能告诉我,我怎样才能做到这一点Marklogic

4

3 回答 3

1

据我所知,该search:search函数实际上并没有自己的缓存。search:parse使用and可能会更愉快search:resolve-nodes,但 XQuery 求值器仍会将 XML 带入内存以提取作者文本。

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

于 2012-05-10T23:11:01.803 回答
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>
于 2012-05-10T17:22:17.407 回答
0

如果您想要非常苗条的结果,请使用 Cts:search 而不是 search:search。

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

这会给你一个比 Search:search 更苗条的结果,应该避免使用 search:search 并通过这条路线。这提供了更大的灵活性和苗条的结果集。

于 2015-03-23T13:14:47.300 回答