Indexing 如何在marklogic中的现有元素范围索引中添加排序规则

Indexing 如何在marklogic中的现有元素范围索引中添加排序规则,indexing,marklogic,marklogic-7,Indexing,Marklogic,Marklogic 7,我已经在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://ww

我已经在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)*
它不包括排序规则元素,因为这对于gYear标量类型不是必需的。创建此索引后,元素无效值的默认值为reject

现在我有一个要求,我必须更新这个现有索引,我必须修改无效值的值以忽略它。当我尝试这样做时,由于缺少collation元素,我得到了一个错误。我只找到了一个解决方案,即删除索引并重新创建,这在我的情况下是不可接受的


因此,我想先在现有索引中添加一个空的排序规则元素,然后对无效值应用更改。那么除了删除现有的元素范围索引配置来更新现有的元素范围索引配置以添加空的排序规则元素之外,还有其他方法吗?

我建议不要手动为索引创建XML定义,而是使用管理函数来创建。如果是你的话,那就太好了

我不会太担心删除和重新创建索引。如果将删除和添加合并并同时保存,则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)

谢谢你的帮助。这确实是非常有用的信息。但我在运行您提供的脚本时遇到了问题。据我所知,我在删除时遇到了这个错误,因为我试图删除一个现有的元素范围索引,它没有任何排序规则元素,甚至没有任何空字符串。因为创建此索引时,我没有提供任何排序规则元素,甚至没有任何空字符串。我收到以下错误,[1.0-ml]ADMIN-NOSUCHITEM:err:FOER0000范围索引不存在:gYear dummy.com/namespace/dummyValue false Hi@grtjn,您能看看这个吗?有其他的方法,但是这些方法应该在支持人员的指导下执行。我建议联系他们。谢谢@grtjn的帮助。