cts:Marklogic中xs:dateTime()类型的值匹配

时间:2015-04-23 07:26:29

标签: regex xml datetime xquery marklogic

我有一个变量$yearMonth := "2015-02" 我必须在元素Date as xs:dateTime上搜索此日期。 我想使用正则表达式来查找具有此日期的所有文件/文档“2015-02- ??” 我在path-range-index启用了ModifiedInfo/Date 我正在使用以下代码,但收到Invalid cast错误

let $result := cts:value-match(cts:path-reference("ModifiedInfo/Date"), xs:dateTime("2015-02-??T??:??:??.????"))

我还使用了以下代码并获得相同的错误

let $result := cts:value-match(cts:path-reference("ModifiedInfo/Date"), xs:dateTime(xs:date("2015-02-??"),xs:time("??:??:??.????")))

请帮助:)

3 个答案:

答案 0 :(得分:2)

您似乎正在尝试在Path Range索引上使用通配符搜索,该索引具有数据类型xs:dateTime()。

但是,目前MarkLogic不支持此功能。有多种方法可以处理这种情况:

  1. 您可以创建字段索引。
  2. 您可以将其更改为支持通配符搜索的字符串索引。
  3. 您可以运行此解决方法来支持现有系统:

    为cts中的$ x:值(cts:path-reference(" ModifiedInfo / Date")) 返回if(开头 - (xs:string($ x),' 2015-02'))然后$ x else()

  4. 此查询将从词典中提取值,然后您可以过滤所需的日期。

答案 1 :(得分:2)

你可以通过在和查询中组合一对cts:element-range-querys来解决这个问题:

let $target := "2015-02"
let $low := xs:date($target || "-01")
let $high := $low + xs:yearMonthDuration("P1M")
return
  cts:search(
    fn:doc(),
    cts:and-query((
        cts:element-range-query("country", ">=", $low),
        cts:element-range-query("country", "<",  $high)
      ))
  )

来自cts:element-range-query documentation

  

如果要约束一系列值,可以将多个cts:element-range-query构造函数与cts:and-query或任何其他可组合cts:query构造函数组合在一起,如同最后一部分一样。以下示例。

答案 2 :(得分:0)

你也可以考虑做一个cts:带有cts:query的值,用于搜索例如2015-02-01和2015-03-01之间的值。但请注意,如果一个文档中出现多个日期,则需要手动过滤后(例如Navin的选项3),但它可能会加快后过滤的速度..

HTH!