我想搜索文档的文档属性。我只有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
但是,这不起作用。请帮忙。
答案 0 :(得分:0)
我相信你还需要设置可搜索的表达式。尝试添加此选项:
<searchable-expression>xdmp:document-properties()</searchable-expression>
答案 1 :(得分:0)
Fwiw,还有一个XPath轴可以到达属性。
答案 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!