考虑以下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
中实现这一目标?
答案 0 :(得分:1)
据我所知,search:search
函数实际上没有自己的缓存。您可能更乐意使用search:parse
和search: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
这会给你一个比搜索更细微的结果:搜索应该避免使用搜索:搜索并通过这条路线。这样可以提供更大的灵活性和更轻薄的结果。