使用path range index实现DateTime忽略毫秒匹配的XML文档查询
实现方法
你可以通过时间范围边界查询的方式满足需求,该方案可以直接复用已创建的/test/dateTime路径范围索引,同时保留unfiltered查询的高性能:
核心逻辑是把原有的精确匹配查询调整为区间匹配:只要dateTime值落在「目标时间 ~ 目标时间+1秒」的左闭右开区间内,就符合匹配规则,这样不管时间值是否带毫秒,只要属于同一秒就会被命中。
可直接运行的查询示例
let $target := xs:dateTime("2021-08-18T17:16:25") return cts:search( doc(), cts:and-query(( cts:path-range-query("/test/dateTime", ">=", $target), cts:path-range-query("/test/dateTime", "<", $target + xs:dayTimeDuration("PT1S")) )), "unfiltered" )
优化建议
如果业务中经常需要执行忽略毫秒的时间查询,可以额外新增一个秒级截断的路径范围索引,索引计算规则为fn:floor-dateTime(/test/dateTime, xs:dayTimeDuration("PT1S")),后续直接对该索引执行等于查询即可,写法更简洁。
内容的提问来源于stack exchange,提问作者marklogic_coder
相关产品推荐
相关产品推荐

