cts中的数字:Marklogic中的单词查询

时间:2016-03-01 05:46:18

标签: xquery marklogic

我有一个cts:word-query,它以数字作为文本值。 cts:search(fn:doc(),cts:word-query("226"))

此查询将在文档中获取仅匹配226的结果。但我还需要获取包含0026的文件。

实施例: 这是abc.xml

<a>
<b>00226</b>
</a>

这是abc1.xml

<a>
<b>226</b>
</a>

如果我将查询设为cts:search(fn:doc(),cts:word-query("226")),则只会获取abc1.xml,如果查询为cts:search(fn:doc(),cts:word-query("00226")),则只会获取abc.xml。

但我需要同时获取两份文件,而不管前导零。

2 个答案:

答案 0 :(得分:6)

最简单的方法是使用外卡字符( * )并添加wildcarded选项

cts:search(fn:doc(),cts:word-query("*226", ('wildcarded')))

编辑:

虽然这与示例文档相符,正如Kishan在评论中指出的那样,通配符也匹配不需要的文档(例如包含“226226”)。

由于范围索引在这种情况下不是一个选项,因为数据是混合的,这里有另一种方法:

cts:search(
    fn:doc(),
    cts:word-query(
        for $lead in ('', '0', '00', '000') 
        return $lead || "226"))

显然,这取决于可以存在多少前导零,只有在已知且有限的情况下才会起作用。

答案 1 :(得分:4)

您可以使用标量类型<b>int在数据库中的元素long上添加元素范围索引,然后执行以下查询,它应返回两个文档:< / p>

let $query := cts:element-range-query(xs:QName("b"),"=",00226)
return cts:search(fn:doc(),$query)