2012-11-05 150 views
5

我想搜索文檔的文檔屬性。我只有加載了Marklogic的文檔,沒有xml文件。我已經關閉了內容處理。現在我想搜索的元數據(存在於xdmp:document-properties(uri)如何在文檔屬性中搜索?

我有一個文件中的以下屬性: -

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

現在我要搜索作者不僅沒有其他屬性。如果我使用search:search("Administrator"),那麼它在整個文檔中查找這個單詞。但是,我只想搜索文檔屬性中的作者標籤。同樣我也想在其他屬性中搜索。

我也試過這樣: -

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 

但是,這是行不通的。請幫忙。

回答

0

我相信你還需要設置可搜索的表達式。嘗試添加此選項:

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

Fwiw,還有一個XPath軸來獲取屬性。

property::

0

與性能約束的問題是,它只是改變了片段範圍,並且不接受name屬性將搜索範圍限制到只有一個屬性。如果你添加<return-query>true</return-query>你會看到結果查詢是什麼。

有雖然幾個選項..

第一種選擇是使用<fragment-scope>properties</fragment-scope>。您可以在頂層使用它來將其應用於所有搜索約束,並且還可以根據每個約束來僅影響特定約束。這是一種相對簡單的方法,可以強制搜索查詢運行屬性片段,而不是通過文檔片段。但不利的一面是,它不會影響搜索匹配,即片段。

要影響片段,您最好使用@mblakele建議的內容,並使用searchable-expression:<searchable-expression>xdmp:document-properties()</searchable-expression>。這實際上會影響片段和搜索查詢,因此使用它會讓您獲取搜索片段,並讓查詢在屬性片段上運行。儘管作者約束仍然不限制您的作者屬性。

一旦搜索運行在屬性片段上,限制搜索到一個特定的屬性實際上是非常簡單的。它只是其他任何元素。使用元素單詞,值或範圍約束來使其工作。

下面一些代碼來說明上面:

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 
) 

第四個例子應該給你你正在尋找的結果。

HTH!