删除非字符串路径范围索引时遇ADMIN-NOSUCHITEM错误求助
解决MarkLogic删除非字符串路径范围索引时的NOSUCHITEM错误
可能的原因及排查步骤
索引路径/类型的精确匹配问题
MarkLogic对路径索引的路径字符串、数据类型是严格匹配的——哪怕一个字母大小写错误、路径多了个斜杠、类型参数写错,都会触发这个“不存在”的错误。你可以先执行以下查询列出目标数据库的所有路径索引:let $db-id := xdmp:database("你的数据库名") return xdmp:database-range-path-indexes($db-id)仔细对比返回结果里的路径、数据类型和你删除操作中指定的参数是否完全一致,包括命名空间前缀(如果索引路径包含命名空间的话)。
配置未持久化或集群未同步
虽然你用了xdmp:set()更新配置,但这个操作只是在内存中修改配置,需要调用xdmp:save-configuration()把配置持久化到磁盘。另外,如果是集群环境,要等待几秒让配置同步到所有节点后,再尝试删除操作。同时确认你是在目标数据库的上下文执行删除,别误操作到其他数据库了。索引状态异常
如果索引处于正在构建、禁用或者损坏的状态,也可能导致删除时识别不到。可以先检查索引的状态:let $db-id := xdmp:database("你的数据库名") let $path := "/目标索引路径" let $type := xs:int("int") return xdmp:database-range-path-index-get-enabled($db-id, $path, $type)如果状态是
false,可以先启用它(等待构建完成)再删除;如果状态异常,尝试禁用后再删除。元数据不一致的极端情况
极少数情况下,数据库的索引元数据可能出现不一致。这时候可以尝试先重启MarkLogic节点(尽量在业务低峰期操作),刷新元数据后再执行删除操作。
正确的删除操作示例
以删除int类型的路径索引为例:
(: 1. 定义目标数据库、索引路径和类型 :) let $db-name := "你的数据库名" let $db-id := xdmp:database($db-name) let $target-path := "/user/age" let $index-type := xs:int("int") (: 2. 执行删除操作 :) let $delete-result := xdmp:database-delete-range-path-index($db-id, $target-path, $index-type) (: 3. 持久化配置 :) return xdmp:save-configuration()
内容的提问来源于stack exchange,提问作者Rajat Jain
相关产品推荐
相关产品推荐

