[英]Is Marklogic search with position possible?
下面有一些用例的解釋; 實際問題如下。
我在一些包含表單元素的文檔上使用 ML 搜索查詢:
<resource>
<version>
<metadata label="author">Jim</metadata>
...
</version>
<version>
<metadata label="author">John</metadata>
...
</version>
</resource>
注意元數據的版本控制。 最上面的版本元素包含文檔的最新信息。
查詢基於用戶輸入; 用戶查找例如作者為 John 的文檔。
我沒有足夠的知識以比這更好的方式組合屬性值和元素/文本值查詢:
cts:near-query((cts:element-attribute-value-query(xs:QName("metadata"), xs:QName("label"), "author"), cts:element-value-query(xs:QName("metadata"), "John")), 0)
不過它確實有效,所以我很好。 不起作用的是只選擇資源中的最后一個版本(/resource/version[1])。 如果在某個時刻,“作者”從“John”更改為“Jim”,則始終會找到具有如上所示資源的文檔,因為我不知道如何只查找最后一個中的值(最上面的)版本元素。 所以我必須在循環中再次過濾 XPath 的結果。
有沒有辦法在 ML 搜索查詢級別上做到這一點?
您可以使用第一個version
元素中的@label="author"
指向metadata
的路徑創建一個字段: /resource/version[1]/metadata[@label="author"]
然后您可以使用cts:field-value-query()
然后您可以搜索該命名字段:
cts:search(doc(), cts:field-value-query("author", "John"))
只需通過 xPath,某人(您自己或 MarkLogic)將不得不對您想要的值進行過濾。 甚至使用可搜索表達式和使用過濾選項也是如此。 這就是在文檔中重復元素的情況。
最有效的方法是分別索引有問題的路徑,然后針對該值進行查詢。
一些選項:
請注意分號 ( ; ) - 這里有三個單獨的執行。 (1) 字段創建,(2) 文檔插入和 (3) 搜索。
xquery version "1.0-ml";
import module namespace admin = "http://marklogic.com/xdmp/admin"
at "/MarkLogic/admin.xqy";
let $config := admin:get-configuration()
let $dbid := xdmp:database("Documents")
let $field-name := "latest-resource"
return
if(empty(admin:database-get-fields($config, $dbid)[./*:field-name="latest-resource"]))
then
let $field-spec := <field xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://marklogic.com/xdmp/database">
<field-name>{$field-name}</field-name>
<field-path><path>/resource/version[./metadata/@label="author"][1]</path>
<weight>1.0</weight>
</field-path>
<word-searches>false</word-searches>
<field-value-searches>true</field-value-searches>
</field>
let $_ := admin:save-configuration(admin:database-add-field($config,$dbid,$field-spec))
return ()
else ();
(:--------------------------------------------:)
(
xdmp:document-insert("/sample/jim-first.xml", <resource>
<version>
<metadata label="author">Jim</metadata>
</version>
<version>
<metadata label="author">John</metadata>
</version>
</resource>),
xdmp:document-insert("/sample/john-first.xml", <resource>
<version>
<metadata label="author">John</metadata>
</version>
<version>
<metadata label="author">Jim</metadata>
</version>
</resource>)
);
(: ----------------------------------------------------- :)
cts:search(doc(), cts:field-value-query("latest-resource", "Jim"))
在這種情況下,只返回 Jim 在第一個版本中的位置。
<resource>
<version>
<metadata label="author">Jim</metadata>
</version>
<version>
<metadata label="author">John</metadata>
</version>
</resource>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.