如何创建字段

时间:2015-01-30 15:04:43

标签: indexing marklogic

我正在尝试使用Admin API创建一个在MarkLogic数据库上添加Fields的脚本。我创建了以下函数来执行此任务:

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 := ()

我正在通过QC运行完整的脚本,而我的MarkLogic版本是&#34; 7.0-1&#34;。我已经通过脚本成功创建了元素范围索引,属性范围索引。但为此我得到了错误。

错误描述表明该字段包含root。但是,我保持虚假()

admin:database-field("VideoTitle1", fn:false())

我使用的是错误的功能还是错过了什么?

请帮忙。

2 个答案:

答案 0 :(得分:3)

如果您尝试设置整个数据库,通常最好使用打包API和服务:https://developer.marklogic.com/learn/packaging-tutorial浏览配置管理器Web UI,然后有{{3 },guideXQuery API

那说让我们试试调试。调试错误消息很困难,因为错误消息中的变量名称和行号与示例代码不匹配。例如,堆栈跟踪具有$database-id,但您的代码具有$dbid。测试用例需要可重现。

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

如果您真的想坚持使用管理员API,我建议您更改代码,以便只拨打admin:save-configuration一次。面对任何需要重启的问题,这样更有效,更强大。安排此操作的一种方法是为每个函数调用获取$config as element(configuration)参数并返回带有更改的新element(configuration)。另一种方法是使用模块变量$CONFIG as element(configuration)并使用xdmp:set对其进行变更。请查看https://docs.marklogic.com/admin:database-path-field,了解这两种技术的示例。

这是您的代码的工作版本:

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)

答案 1 :(得分:1)

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

https://github.com/marklogic/roxy

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

另一种较少侵入性的解决方案可能是配置数据库一次,然后使用内置配置管理器(http://host:8002/nav/)导出数据库设置,并使用导出将设置导入其他位置。

HTH!