2012-11-05 5 views
5

Desidero cercare le proprietà del documento dei documenti. Ho solo documenti caricati in Marklogic e non ci sono file xml. Ho disattivato l'elaborazione del contenuto. Ora voglio cercare un metadati (presente in xdmp:document-properties(uri))Come cercare nelle proprietà del documento?

Ho le seguenti proprietà di un documento: -

<?xml version="1.0" encoding="UTF-8"?> 
<prop:properties xmlns:prop="http://marklogic.com/xdmp/property"> 
    <uploaded>true</uploaded> 
    <OntologyResourceTypeValue>DOCUMENT</OntologyResourceTypeValue> 
    <content-type>application/pdf</content-type> 
    <filter-capabilities>text subfiles HD-HTML</filter-capabilities> 
    <CreationDate>2002/12/05 09:44:29Z</CreationDate> 
    <ModDate>2002/12/05 12:02:27+02'00'</ModDate> 
    <Producer>Acrobat Distiller 5.0 (Windows)</Producer> 
    <Author>Administrator</Author> 
    <Creator>PScript5.dll Version 5.2</Creator> 
</prop:properties> 

Ora voglio cercare Autore solo non altre proprietà. Se sto usando search:search("Administrator") allora sta cercando questa parola nell'intero documento. Ma, voglio cercare solo il tag Autore nelle proprietà del documento. Allo stesso modo voglio cercare anche in altre proprietà.

Inoltre ho provato questo: -

let $options := <options xmlns="http://marklogic.com/appservices/search"> 
          <constraint name="author"> 
         <properties name="prop:Author"/> 
         </constraint> 
        </options> 
    let $results := search:search("author:Administrator", $options, 1, 10) 
    return 
    $results 

Ma, questo non funziona. Per favore aiuto.

risposta

0

Credo che sarà anche necessario impostare l'espressione ricercabile. Prova ad aggiungere questa opzione:

<searchable-expression>xdmp:document-properties()</searchable-expression> 
0

FWIW, c'è anche un asse XPath per arrivare alla proprietà.

property::

0

Il problema con un vincolo di proprietà è, che cambia solo la portata frammento, e non accetta un attributo name per limitare la ricerca a un solo immobile. Se aggiungi <return-query>true</return-query> vedresti quale sarebbe la query risultante.

Ci sono alcune opzioni anche se ..

prima opzione è quella di utilizzare <fragment-scope>properties</fragment-scope>. È possibile utilizzarlo al livello più alto per applicarlo a tutti i vincoli di ricerca e anche per vincolo solo per influenzare determinati vincoli. È un modo relativamente semplice per imporre le query di ricerca per l'esecuzione su frammenti di proprietà, anziché su frammenti di documenti. Il rovescio della medaglia è che non influenzerà le corrispondenze di ricerca, anche frammenti.

Per influenzare i frammenti, è meglio fare ciò che suggerisce @mblakele e utilizzare l'espressione ricercabile: <searchable-expression>xdmp:document-properties()</searchable-expression>. Ciò influenzerà in realtà sia gli snippet che le query di ricerca, quindi l'utilizzo di tale funzione ti consentirà di ottenere snippet di ricerca e di eseguire query su frammenti di proprietà. Il vincolo dell'autore non limita comunque la proprietà del tuo autore.

Una volta eseguita la ricerca su frammenti di proprietà, limitare la ricerca a una particolare proprietà è in realtà piuttosto semplice. È solo un elemento come tutti gli altri. Usa un vincolo di parola, valore o intervallo per farlo funzionare.

Di seguito il codice per illustrare quanto sopra:

xquery version "1.0-ml"; 

import module namespace search = "http://marklogic.com/appservices/search" 
    at "/MarkLogic/appservices/search/search.xqy"; 

(: original approach :) 
let $options1 := 
    <options xmlns="http://marklogic.com/appservices/search"> 
    <constraint name="author"> 
     <properties name="prop:Author"/> 
    </constraint> 
    <return-query>true</return-query> 
    </options> 
let $results1 := search:search("author:Administrator", $options1, 1, 1) 

(: using fragment-scope :) 
let $options2 := 
    <options xmlns="http://marklogic.com/appservices/search"> 
    <fragment-scope>properties</fragment-scope> 
    <constraint name="author"> 
     <properties name="prop:Author"/> 
    </constraint> 
    <return-query>true</return-query> 
    </options> 
let $results2 := search:search("author:Administrator", $options2, 1, 1) 

(: using searchable-expression :) 
let $options3 := 
    <options xmlns="http://marklogic.com/appservices/search"> 
    <searchable-expression>xdmp:document-properties()</searchable-expression> 
    <constraint name="author"> 
     <properties name="prop:Author"/> 
    </constraint> 
    <return-query>true</return-query> 
    </options> 
let $results3 := search:search("author:Administrator", $options3, 1, 1) 

(: using searchable-expression with an element word constraint :) 
let $options4 := 
    <options xmlns="http://marklogic.com/appservices/search"> 
    <searchable-expression>xdmp:document-properties()</searchable-expression> 
    <constraint name="author"> 
     <word> 
     <element name="Author" ns="http://marklogic.com/xdmp/property"/> 
     </word> 
    </constraint> 
    <return-query>true</return-query> 
    </options> 
let $results4 := search:search("author:Administrator", $options4, 1, 1) 

return (
    $results1, 
    $results2, 
    $results3, 
    $results4 
) 

Il quarto esempio dovrebbe dare i risultati che stavi cercando.

HTH!