MarkLogic如何为指定JSON属性创建专属通配符索引实现通配符搜索
MarkLogic特定JSON属性通配符搜索实现方案
核心结论:不需要开启数据库全局通配符索引,完全可以针对指定JSON属性创建专属通配符索引,兼顾搜索性能和索引存储开销。
具体实现路径
方案1:字段级专属通配符索引(推荐,适配多属性绑定场景)
- 第一步创建自定义字段:进入对应数据库的管理配置页,找到Fields模块新建自定义字段,将字段的匹配范围精准绑定到需要做通配符搜索的目标JSON属性(比如示例中的
inventor属性),配置时明确指定JSON属性路径,排除所有无关属性,不做全库范围匹配。 - 第二步给字段单独配置通配符索引:字段创建完成后,在字段的索引配置项中,按需勾选对应的通配符索引能力即可:
- 如果只需要前缀匹配(如
Roth*),仅开启词首通配符索引 - 如果只需要后缀匹配(如
*Roth),仅开启词尾通配符索引 - 如果需要词中匹配(如示例中的
R?th这类单/多字符通配符出现在词中间的场景),按需开启双字符、三字符中缀通配符索引
以上索引仅对绑定到该字段的指定属性生效,索引构建开销、存储占用远低于全局通配符索引。
- 如果只需要前缀匹配(如
- 索引生效后调整查询写法,直接命中字段索引,参考代码:
cts.search( cts.fieldValueQuery( "自定义的目标字段名", "R?th", ["wildcarded", "whitespace-sensitive"] ) )
方案2:路径级通配符索引(适配单固定路径属性场景)
如果仅需要给单个固定路径的JSON属性开通配符能力,可以直接创建路径范围索引:
- 在数据库配置的路径范围索引模块新建索引,填写目标属性的完整JSON路径,在索引配置中勾选需要的通配符选项即可,不需要额外创建字段,配置流程更简单。
- 查询时使用
cts.pathValueQuery搭配wildcarded参数,即可直接命中该路径的专属通配符索引。
性能避坑提示
- 不要在无对应字段/路径通配符索引支撑的情况下,直接给
cts.jsonPropertyValueQuery添加wildcarded参数执行通配符搜索:这种场景下MarkLogic会在查询时动态遍历对应属性的所有存储值做逐值匹配,数据量达到十万级以上就会出现明显的查询延迟,高并发场景下还可能占用大量计算、内存资源。 - 配置索引时不要使用宽泛的匹配规则,精准绑定目标属性路径即可,避免无关内容被纳入索引,产生不必要的存储开销。
- 按需选择通配符索引类型,不需要全类型开启,比如没有词中匹配需求就不要开中缀索引,能进一步压缩索引体积、提升索引构建速度。
内容的提问来源于stack exchange,提问作者Nadia
相关产品推荐
相关产品推荐

