2012-11-05 6 views
5

Ich möchte Dokumenteigenschaften der Dokumente suchen. Ich habe nur Dokumente in Marklogic geladen und keine XML-Dateien vorhanden. Ich habe die Inhaltsverarbeitung deaktiviert. Jetzt möchte ich für eine Metadaten (in xdmp:document-properties(uri))Wie in Dokumenteigenschaften suchen?

Ich habe die folgenden Eigenschaften in einem Dokument suchen: -

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

Jetzt habe ich für Autor suchen möchten nicht nur andere Eigenschaften. Wenn ich search:search("Administrator") verwende, sucht es im gesamten Dokument nach diesem Wort. Aber ich möchte nur nach dem Author-Tag in Dokumenteigenschaften suchen. Ähnlich möchte ich auch in anderen Eigenschaften suchen.

Ich habe auch versucht, dies: -

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 

Aber das funktioniert nicht. Bitte helfen Sie.

Antwort

0

Ich glaube, dass Sie auch den durchsuchbaren Ausdruck festlegen müssen. Versuchen Sie, diese Option hinzuzufügen:

0

Fwiw, es gibt auch eine XPath-Achse, um Eigenschaften zu erhalten.

property::

0

Das Problem mit Eigenschaften Einschränkung ist, dass es nur das Fragment Umfang ändert, und akzeptiert keinen Namen Attribut um die Suche zu beschränken nur eine Eigenschaft auf. Wenn Sie <return-query>true</return-query> hinzufügen, würden Sie sehen, was die resultierende Abfrage wäre.

Es gibt ein paar Optionen, obwohl ..

Erste Option ist <fragment-scope>properties</fragment-scope> zu verwenden. Sie können dies auf oberster Ebene verwenden, um es auf alle Sucheinschränkungen anzuwenden, und auch pro Einschränkung, um nur bestimmte Einschränkungen zu beeinflussen. Es ist eine relativ einfache Möglichkeit, Suchabfragen so zu erzwingen, dass sie über Objektfragmente anstatt über Dokumentfragmente ausgeführt werden. Der Nachteil ist jedoch, dass es keine Suchtreffer, sogenannte Snippets, beeinflusst.

Um die Snippets zu beeinflussen, sollten Sie besser tun, was @mblakele vorschlägt, und durchsuchbaren Ausdruck verwenden: <searchable-expression>xdmp:document-properties()</searchable-expression>. Dies wirkt sich sowohl auf Snippets als auch auf Suchanfragen aus. Wenn Sie dies verwenden, werden Sie Such-Snippets erhalten und die Abfragen über die Eigenschaftsfragmente laufen lassen. Die Einschränkung für Autoren beschränkt sich jedoch nicht auf Ihre Author-Eigenschaft.

Sobald die Suche nach Eigenschaftenfragmenten ausgeführt wird, ist die Suche auf eine bestimmte Eigenschaft sehr einfach. Es ist nur ein Element wie jedes andere. Verwenden Sie ein Elementwort, einen Wert oder eine Bereichsbeschränkung, um dies zu erreichen.

Im Folgenden einige Code die oben veranschaulichen:

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 
) 

Das vierte Beispiel Ihnen die Ergebnisse, sollte Sie suchen.

HTH!

Verwandte Themen