cts中的数字: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。

但是我需要同时获得两个文档,而不考虑前导零。

最简单的方法是使用通配符 (*) 并添加 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"))

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

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

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

最新更新