我使用ML Java API中的RawQueryByExampleDefinition使用Search Query By Example。在我们升级到版本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格式。有没有办法动态或以编程方式创建元素范围索引,以便系统首先检查传入的“无模式”数据,并根据传入的JSON结构或元素动态添加元素范围索引?
答案 0 :(得分:1)
这听起来像是修复了我的错误。您应该始终为任何大小的查询排序选项提供适当的范围索引。如果规模不重要,请用Java进行排序。
您可以使用管理API创建范围索引:https://docs.marklogic.com/admin:database-add-range-element-index和相关功能。您可以根据需要创建任意数量的范围索引。
它可能会公开一个允许用户按需创建范围索引的REST API。但是在你的情况下,我首先要做一些仔细的分析,因为这可能会导致磁盘和内存利用率无限增长。您可能还必须考虑具有相同名称但语法含义不同的元素之间可能存在的冲突,需要不同的排序规则等。这就是XML命名空间的用途:ns1:title
vs ns2:title
。但是JSON没有名称空间。
答案 1 :(得分:1)
我认为值得指出的是,您还可以创建一个字段范围索引,该索引基于一个字段,该字段可以使用XPath来匹配任意深度的灵活元素名称列表和json-properties。这样,您的应用程序就可以引用该字段,而服务器上的字段配置可以代表您想要包含的最新元素列表。
然后您的选择将成为:
<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>