Indexing 如何创建字段

Indexing 如何创建字段,indexing,marklogic,Indexing,Marklogic,我正在尝试创建一个脚本,用AdminAPI在MarkLogic数据库上添加字段。我创建了以下函数来执行此任务: declare function local:createField($config as element(configuration), $server-config as element(http-server)) { let $dbid := xdmp:database(fn:data($server-config/database)) let $addField := le

我正在尝试创建一个脚本,用AdminAPI在MarkLogic数据库上添加字段。我创建了以下函数来执行此任务:

declare function local:createField($config as element(configuration), $server-config as element(http-server))
{
let $dbid := xdmp:database(fn:data($server-config/database))
let $addField :=
  let $fieldspec := admin:database-field("VideoTitle1", fn:false())
  return admin:save-configuration(admin:database-add-field($config, $dbid, $fieldspec))
return "SUCCESS"
};

declare function local:createFieldPath($config as element(configuration), $server-config as element(http-server))
{
let $dbid := xdmp:database(fn:data($server-config/database))
let $addPath :=
  let $fieldpath := admin:database-field-path("/Video/BasicInfo/Title", 1.0)
  return admin:save-configuration(admin:database-add-field-paths($config, $dbid, "VideoTitle1", $fieldpath))
return "SUCCESS"
};

declare function local:createFieldRangeIndex($config as element(configuration), $server-config as element(http-server))
{
let $dbid := xdmp:database(fn:data($server-config/database))
let $addRange :=
  let $rangespec := admin:database-range-field-index("string","VideoTitle1", "http://marklogic.com/collation/",fn:false() )
  return admin:save-configuration(admin:database-add-range-field-index($config, $dbid, $rangespec))
return "SUCCESS"
};
但我得到了一个错误:

[1.0-ml] ADMIN-BADPATHFIELDTYPE: (err:FOER0000) Incorrect field:
  the field VideoTitle1 already has include-root.


In /MarkLogic/admin.xqy on line 5255
In database-check-path-field(<configuration/>, xs:unsignedLong("12095791717198876597"), "VideoTitle1")
$config := <configuration/>
$database-id := xs:unsignedLong("12095791717198876597")
$field-name := "VideoTitle1"
$field := <field xmlns="http://marklogic.com/xdmp/database" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><field-name>VideoTitle1</field-name><include-root>false</include...</field>
$field-path := ()
我使用了错误的函数还是遗漏了什么


请帮忙。

这不是一个直接的答案,但为什么要重新发明别人已经发明的轮子呢。有几种解决方案可以帮助部署数据库设置等。其中一位是Roxy:

Roxy提供了管理MarkLogic项目的完整框架。您可以在github项目的wiki上找到文档和教程

另一个侵入性较小的解决方案是,配置数据库一次,然后使用内置的Configuration Manager()导出数据库设置,然后使用导出将设置导入其他位置


这不是一个直接的答案,但为什么要重新发明别人已经发明的轮子呢。有几种解决方案可以帮助部署数据库设置等。其中一位是Roxy:

Roxy提供了管理MarkLogic项目的完整框架。您可以在github项目的wiki上找到文档和教程

另一个侵入性较小的解决方案是,配置数据库一次,然后使用内置的Configuration Manager()导出数据库设置,然后使用导出将设置导入其他位置


如果您试图设置整个数据库,通常最好使用打包API和服务:浏览configuration manager web UI,然后是、和

也就是说,让我们试着调试一下。调试错误消息很困难,因为错误消息中的变量名和行号与示例代码不匹配。例如,堆栈跟踪具有
$database id
,但您的代码具有
$dbid
。测试用例需要是可复制的

但是,我注意到您没有调用正确的函数来构造字段配置。如果要使用路径,请使用-not
admin:database path
预先这样说。错误消息可能需要一些工作:它应该更像“不正确的字段:字段VideoTitle1不是路径字段”

如果您真的想坚持使用管理API,我建议您更改代码,以便只调用一次
admin:save configuration
。这更高效,在需要重新启动时更健壮。安排此操作的一种方法是,每个函数调用都将
$config作为元素(配置)
参数,并返回一个新的
元素(配置)
。另一种方法是将模块变量
$CONFIG作为元素(配置)
并使用
xdmp:set
对其进行变异。请看两种技术的示例

以下是您的代码的工作版本:

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

declare function local:createField(
  $config as element(configuration),
  $server-config as element(http-server))
as element(configuration)
{
  let $dbid := xdmp:database(fn:data($server-config/database))
  let $fieldspec :=
    admin:database-path-field(
      "VideoTitle1",
      admin:database-field-path("/Video/BasicInfo/Title", 1.0))
  return admin:database-add-field($config, $dbid, $fieldspec)
};

declare function local:createFieldRangeIndex(
  $config as element(configuration),
  $server-config as element(http-server))
as element(configuration)
{
  let $dbid := xdmp:database(fn:data($server-config/database))
  let $rangespec :=
    admin:database-range-field-index(
      "string",
      "VideoTitle1",
      "http://marklogic.com/collation/",
      fn:false())
  return
    admin:database-add-range-field-index(
      $config, $dbid, $rangespec)
};

let $cfg := admin:get-configuration()
let $fubar := <http-server><database>test</database></http-server>
let $_ := xdmp:set($cfg, local:createField($cfg, $fubar))
let $_ := xdmp:set($cfg, local:createFieldRangeIndex($cfg, $fubar))
return admin:save-configuration($cfg)
导入模块名称空间管理=”http://marklogic.com/xdmp/admin"
位于“/MarkLogic/admin.xqy”;
声明函数本地:createField(
$config作为元素(配置),
$server config as元素(http服务器))
as元素(配置)
{
让$dbid:=xdmp:database(fn:data($server-config/database))
让$fieldspec:=
管理员:数据库路径字段(
“视频标题1”,
管理员:数据库字段路径(“/Video/BasicInfo/Title”,1.0))
return admin:database add字段($config、$dbid、$fieldspec)
};
声明函数本地:createFieldRangeIndex(
$config作为元素(配置),
$server config as元素(http服务器))
as元素(配置)
{
让$dbid:=xdmp:database(fn:data($server-config/database))
让$rangespec:=
管理员:数据库范围字段索引(
“字符串”,
“视频标题1”,
"http://marklogic.com/collation/",
fn:false()
返回
管理员:数据库添加范围字段索引(
$config、$dbid、$rangespec)
};
让$cfg:=admin:get-configuration()
让$fubar:=测试
让$979;:=xdmp:set($cfg,local:createField($cfg,$fubar))
让$u3;:=xdmp:set($cfg,local:createFieldRangeIndex($cfg,$fubar))
返回管理员:保存配置($cfg)

如果您试图设置整个数据库,通常最好使用打包API和服务:介绍configuration manager web UI,然后是、和

也就是说,让我们试着调试一下。调试错误消息很困难,因为错误消息中的变量名和行号与示例代码不匹配。例如,堆栈跟踪具有
$database id
,但您的代码具有
$dbid
。测试用例需要是可复制的

但是,我注意到您没有调用正确的函数来构造字段配置。如果要使用路径,请使用-not
admin:database path
预先这样说。错误消息可能需要一些工作:它应该更像“不正确的字段:字段VideoTitle1不是路径字段”

如果您真的想坚持使用管理API,我建议您更改代码,以便只调用一次
admin:save configuration
。这更高效,在需要重新启动时更健壮。安排此操作的一种方法是,每个函数调用都将
$config作为元素(配置)
参数,并返回一个新的
元素(配置)
。另一种方法是将模块变量
$CONFIG作为元素(配置)
并使用
xdmp:set
对其进行变异。请看两种技术的示例

以下是您的代码的工作版本:

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

declare function local:createField(
  $config as element(configuration),
  $server-config as element(http-server))
as element(configuration)
{
  let $dbid := xdmp:database(fn:data($server-config/database))
  let $fieldspec :=
    admin:database-path-field(
      "VideoTitle1",
      admin:database-field-path("/Video/BasicInfo/Title", 1.0))
  return admin:database-add-field($config, $dbid, $fieldspec)
};

declare function local:createFieldRangeIndex(
  $config as element(configuration),
  $server-config as element(http-server))
as element(configuration)
{
  let $dbid := xdmp:database(fn:data($server-config/database))
  let $rangespec :=
    admin:database-range-field-index(
      "string",
      "VideoTitle1",
      "http://marklogic.com/collation/",
      fn:false())
  return
    admin:database-add-range-field-index(
      $config, $dbid, $rangespec)
};

let $cfg := admin:get-configuration()
let $fubar := <http-server><database>test</database></http-server>
let $_ := xdmp:set($cfg, local:createField($cfg, $fubar))
let $_ := xdmp:set($cfg, local:createFieldRangeIndex($cfg, $fubar))
return admin:save-configuration($cfg)
导入模块名称空间管理=”http://marklogic.com/xdmp/admin"
位于“/MarkLogic/admin.xqy”;
声明函数本地:createField(
$config作为元素(配置),
$server config as元素(http服务器))
as元素(配置)
{
让$dbid:=xdmp:database(fn:data($server-config/database))
让$fieldspec:=
管理员:数据库路径字段(
“视频标题1”,