2012-11-05 30 views
5

Chcę wyszukiwać właściwości dokumentu dokumentów. Mam tylko dokumenty załadowane do Marklogic i nie ma tam plików xml. Wyłączyłem przetwarzanie treści. Teraz chcę, aby wyszukać metadanych (obecne w xdmp:document-properties(uri))Jak wyszukiwać we właściwościach dokumentu?

Mam następujące właściwości w dokumencie: -

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

teraz chcę szukać Autor nie tylko inne właściwości. Jeśli używam search:search("Administrator"), to szuka tego słowa w całym dokumencie. Ale chcę wyszukać tylko znacznik Autor we właściwościach dokumentu. Podobnie chcę szukać również w innych właściwościach.

Próbowałem również to: -

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 

Ale to nie działa. Proszę pomóż.

Odpowiedz

0

Uważam, że trzeba będzie również ustawić wyszukiwane wyrażenie. Spróbuj dodać tę opcję:

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

Fwiw, istnieje również oś XPath, aby uzyskać dostęp do właściwości.

property::

0

Problem z właściwości ograniczeniem jest to, że to tylko zmienia zakres jego fragment, a nie przyjmować atrybut name, aby ograniczyć wyszukiwanie tylko jedną właściwość. Jeśli dodasz <return-query>true</return-query> zobaczysz, jakie będzie wynikowe zapytanie.

Istnieje kilka opcji, chociaż ..

Pierwsza opcja jest użycie <fragment-scope>properties</fragment-scope>. Możesz użyć tego na najwyższym poziomie, aby zastosować go do wszystkich ograniczeń wyszukiwania, a także do ograniczenia, aby wpływać tylko na określone ograniczenia. Jest to względnie łatwy sposób na wymuszenie przeszukiwania zapytań na fragmentach właściwości zamiast na fragmentach dokumentów. Wadą jest jednak to, że nie wpłynie to na wyniki wyszukiwania, czyli fragmenty.

Aby wpłynąć na fragmenty tekstu, lepiej robić to, co sugeruje @mblakele, i używać wyszukującego wyrażenia: <searchable-expression>xdmp:document-properties()</searchable-expression>. Wpłynie to zarówno na fragmenty, jak i zapytania, więc użycie tego spowoduje, że otrzymasz fragmenty wyszukiwania i zapytania będą przebiegać po fragmentach właściwości. Ograniczenie autora nadal nie ogranicza się jednak do właściwości twojego autora.

Po przeszukiwaniu przebiega fragmentów właściwości, ograniczając wyszukiwanie do konkretnej nieruchomości jest całkiem proste. To tylko element, jak każdy inny. Użyj ograniczenia elementu, wartości lub zakresu, aby to zadziałało.

Poniżej pewnego kodu do zilustrowania powyższego:

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 
) 

Czwarty przykład powinny dać wyniki, czego szukasz.

HTH!

Powiązane problemy