0

我已经在 MarkLogic 7 中创建了一个标量类型的元素范围索引gYear。我编写了以下脚本,运行它并成功创建了索引,

xquery version "1.0-ml";
import module namespace admin = "http://marklogic.com/xdmp/admin" at "/MarkLogic/admin.xqy";
let $newRangeIndexes := (
    <range-element-index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://marklogic.com/xdmp/database">
      <scalar-type>gYear</scalar-type>
      <namespace-uri>http://www.dummy.com/namespaces/dummy</namespace-uri>
      <localname>dummyValue</localname>
      <range-value-positions>false</range-value-positions>
    </range-element-index>
)
  let $config := admin:get-configuration()
  let $dbid := xdmp:database()
  let $newConfig :=  admin:database-add-range-element-index($config, $dbid, $newRangeIndexes)
  return
     admin:save-configuration($newConfig)*

它不包含元素,因为这对于标量类型collation不是必需的。gYear创建此索引后,元素的默认invalid-values值为reject.

现在我有一个要求,我必须更新这个现有索引(我必须修改 to 的值invalid-valuesignore。当我尝试这样做时,由于缺少该collation元素而出现错误。我发现只有一种解决方案是删除索引并重新创建,这在我的情况下是不可接受的。

所以我想先collation在这个现有索引中添加一个空元素,然后我将我的更改应用于invalid-values. 那么有没有其他方法(除了删除现有的)来更新现有的元素范围索引配置以添加一个空collation元素?

4

1 回答 1

1

我建议不要手动为索引创建 XML 定义,而是使用管理函数来执行此操作。在您的情况下,这将是admin:database-range-element-index

我不会太担心删除和重新创建索引。如果您组合删除和添加,并同时保存两者,MarkLogic 将仅根据需要应用更改。

要将特定元素的现有定义替换为不同的定义,您可以执行以下操作:

xquery version "1.0-ml";

import module namespace admin = "http://marklogic.com/xdmp/admin" at "/MarkLogic/admin.xqy";

declare namespace db = "http://marklogic.com/xdmp/database";

let $config := admin:get-configuration()
let $database-id := xdmp:database()

let $existing-index := admin:database-get-range-element-indexes($config, $database-id)[
  db:namespace-uri = "http://www.dummy.com/namespaces/dummy"
    and db:localname = "dummyValue"
]
let $config := admin:database-delete-range-element-index($config, $database-id, $existing-index)

let $config :=  admin:database-add-range-element-index($config, $database-id, admin:database-range-element-index(
  "gYear",
  "http://www.dummy.com/namespaces/dummy",
  "dummyValue",
  (), 
  fn:false(),
  "reject"
))

return
  admin:save-configuration($config)

于 2017-10-11T13:14:31.703 回答