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
相关产品推荐
相关产品推荐

