簡體   English   中英

是否可以使用 position 進行 Marklogic 搜索?

[英]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)將不得不對您想要的值進行過濾。 甚至使用可搜索表達式和使用過濾選項也是如此。 這就是在文檔中重復元素的情況。

最有效的方法是分別索引有問題的路徑,然后針對該值進行查詢。

一些選項:

  • 提取值的 TDE 模板。 盡管非常強大並且可能是我的選擇,但它與您的簡單示例相去甚遠,因此我將傳遞該示例。
  • 范圍指數。 很好,但是 memory 映射假設您想要進行范圍查詢 - 但您的查詢是一個簡單的值查詢,所以我們將跳過這個
  • 簡單,優雅,這里需要什么。 將 xPath 精確定義為您想要的,第二遍索引將提取該值並使用其自己的索引規則單獨對其進行索引。 然后您可以查詢該值。

請注意分號 ( ; ) - 這里有三個單獨的執行。 (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM