考虑以下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()
但是,xpath首先在缓存中缓存整个结果,然后使用search:search
找到我们想要的节点。我不想要这个。我希望search:search
API只返回所需的元素,这样就不会在marklogic
服务器中缓存整个结果集。有人能告诉我,请告诉我如何在Marklogic
实现这一点吗?
发布于 2012-05-10 15:11:01
据我所知,search:search
函数实际上没有自己的缓存。您可能更喜欢使用search:parse
和search:resolve-nodes
,但是为了提取作者文本,XQuery计算器仍然会将XML带入内存。
进一步远离search,您可以在author
上创建一个范围索引,并使用cts:element-values
直接从索引中获取其值。
发布于 2012-05-10 09:22:17
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>
发布于 2015-03-23 05:14:47
使用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
这会给你一个比搜索更小的结果:搜索,你应该避免使用搜索:搜索,并通过这条路线。这提供了更多的灵活性和更小的结果集。
https://stackoverflow.com/questions/10534193
复制