如何在文档属性中搜索?

时间:2012-11-05 13:37:26

标签: marklogic

我想搜索文档的文档属性。我只有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"),则它会在整个文档中查找此单词。但是,我想只搜索文档属性中的Author标记。同样,我也希望在其他属性中搜索。

我也试过这个: -

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

但是,这不起作用。请帮忙。

3 个答案:

答案 0 :(得分:0)

我相信你还需要设置可搜索的表达式。尝试添加此选项:

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

答案 1 :(得分:0)

Fwiw,还有一个XPath轴可以到达属性。

property::

答案 2 :(得分:0)

属性约束的问题是,它只更改片段范围,并且不接受name属性来将搜索限制为仅一个属性。如果您添加<return-query>true</return-query>,您会看到生成的查询结果。

虽然有几个选择..

第一个选项是使用<fragment-scope>properties</fragment-scope>。您可以在顶层使用它将其应用于所有搜索约束,并且还可以根据约束仅影响特定约束。这是一种相对简单的方法,可以强制搜索查询在属性片段上运行,而不是在文档片段上运行。不利的一面是它不会影响搜索匹配,也就是片段。

为了影响片段,你最好不要做@mblakele建议的事情,并使用搜索表达式:<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!