You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MarkLogic结构化词/值查询匹配结果超出预期的原因排查

MarkLogic Java API结构化查询匹配异常原因及解决

问题背景

尝试通过MarkLogic Java API的结构化查询,匹配JSON属性xyz值包含特定子串的文档,编写的代码如下:

var jsonProperty = queryBuilder.jsonProperty("xyz");
String[] wordOptions = {"case-insensitive", "wildcarded"};
return queryBuilder.word(jsonProperty, null, wordOptions, 0, "*m-Em i*");

但查询结果超出预期,比如属性值为"PM-EM 926-2:2020"的文档被错误匹配。而对应的XQuery查询能得到预期结果:

cts:search(fn:doc(), cts:json-property-word-query("xyz", "*m-Em I*", ("case-insensitive", "wildcarded")))

问题原因

核心差异在于Java API中queryBuilder.word()和XQuery中cts:json-property-word-query的处理逻辑不同:

  • queryBuilder.word()是通用词查询,它会先对JSON属性值做分词处理(连字符-会被当作分词分隔符),然后将查询词*m-Em i*拆分为*m、Em、i*三个独立词项进行匹配。只要属性值中包含任意一个词项(比如"PM-EM"包含m和EM),就会被命中,这就是错误匹配的根源。
  • cts:json-property-word-query(以及Java API对应的queryBuilder.jsonPropertyWordQuery()方法)是专门针对JSON属性的词查询,启用wildcarded选项后,会将整个带通配符的查询字符串当作整体词模式处理,不会拆分连字符分隔的内容,只有当属性值中存在包含m-Em i(忽略大小写)的连续子串时才会匹配。

修正方案

将Java代码中的queryBuilder.word()替换为queryBuilder.jsonPropertyWordQuery(),这是XQuerycts:json-property-word-query的等价结构化查询方法:

String[] wordOptions = {"case-insensitive", "wildcarded"};
return queryBuilder.jsonPropertyWordQuery("xyz", "*m-Em i*", wordOptions);

这样就能和XQuery查询保持一致的匹配逻辑,得到预期结果。

内容的提问来源于stack exchange,提问作者brztss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:15:42