MarkLogic 8 Java API - 以编程方式添加元素范围索引

MarkLogic 8 Java API - add element range index programatically

我正在使用 ML Java API 中使用 RawQueryByExampleDefinition 的示例搜索查询。在我们升级到版本 8 之前,传入如下所示的动态选项(关注元素名称):

<options xmlns="http://marklogic.com/appservices/search">
  <sort-order collation="http://marklogic.com/collation/en/S1/EO/CU/MO" type="xs:string" direction="ascending">
    <element ns="" name="dynamicElement"/>
  </sort-order>
</options>

以上适用于没有配置任何元素范围索引的 ML 7。但是,对于 ML 8,这给了我一个错误,在深入研究原因后,似乎现在需要创建一个元素范围索引,否则 ML Java API 将抛出错误。

我的问题是从我的 API 摄取到 ML 中的元素并不是真正预先确定的或无模式的,这意味着它们(客户端)可以插入任何 JSON 格式。有没有办法动态或以编程方式创建元素范围索引,以便系统首先检查传入的 "schemaless" 数据并根据传入的 JSON 结构或元素动态添加元素范围索引?

对我来说这听起来像是一个错误修复。您应该始终 为任何大规模查询排序选项设置适当的范围索引。如果比例不重要,请在 Java.

中进行排序

您可以使用管理 API: https://docs.marklogic.com/admin:database-add-range-element-index 和相关函数创建范围索引。您可以根据需要创建任意数量的范围索引。

公开允许用户按需创建范围索引的 REST API 可能会奏效。但是,在您的情况下,我会先进行一些仔细的分析,因为这可能会导致磁盘和内存利用率的无限增长。您可能还必须考虑具有相同名称但语法含义不同的元素之间可能发生的冲突,调用不同的排序规则等。这就是 XML 名称空间的用途:ns1:titlens2:title。但是 JSON 没有命名空间。

我认为值得指出的是,您还可以创建一个基于字段的字段范围索引,该字段可以使用 XPath 匹配灵活的元素名称列表和任何深度的 json-属性。这样您的应用程序就可以引用该字段,而您服务器上的字段配置可以代表您想要包含的最新元素列表。

那么你的选择将变成:

<options xmlns="http://marklogic.com/appservices/search">
  <sort-order collation="http://marklogic.com/collation/en/S1/EO/CU/MO"
    type="xs:string" direction="ascending">
    <field name="dynamicField"/>
  </sort-order>
</options>