2012-05-10 2 views
2

Рассмотрим следующий XML: -Как вернуть результат фильтрации в Marklogic?

<?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. Я не хочу этого. Я хочу, чтобы API search:search возвращал только нужный элемент, чтобы весь набор результатов не был кэширован в сервере marklogic. Может ли кто-нибудь сказать мне, пожалуйста, как я могу достичь этого в Marklogic?

+0

В MarkLogic термин «отфильтрованный» означает нечто иное, чем ваше использование здесь. –

+0

Являются ли ваши документы XML примерно такими же, как у образца выше, или у одного содержится много тегов ? Если файл большой, возможно, вы можете разделить его на отдельные файлы XML на ? В этом случае, почему вы считаете, что вам нужен поиск вместо просто XPath, например // author/title()? Помимо пейджинга, я не уверен, что поиск: search() делает для вас в этой ситуации. – derickson

ответ

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> 
1

search:search функция действительно не имеет кэш самостоятельно, насколько я знаю. Возможно, вы более счастливы, используя вместо этого search:parse и search:resolve-nodes, но оценщик XQuery все равно поместит XML в память, чтобы извлечь текст автора.

Как можно дальше от API поиска, вы можете создать индекс диапазона на author и использовать cts:element-values, чтобы получить его значения непосредственно из индекса.

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 

Это даст вам тонкий результат, чем поиск: поиск следует избегать, используя поиск: поиск и прохождение этого маршрута. это дает гораздо большую гибкость, а также тонкий набор результатов.

Смежные вопросы