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

Xquery cts中的数字:Marklogic中的单词查询,xquery,marklogic,Xquery,Marklogic,我有一个cts:word查询,它的文本值是number。 cts:search(fn:doc(),cts:wordquery(“226”)) 此查询将获取仅与文档中的226匹配的结果。但是我还需要得到包含0026的文件 例如: 这是abc.xml <a> <b>00226</b> </a> 00226 这是abc1.xml <a> <b>226</b> </a> 226 如果我将查询设置为

我有一个cts:word查询,它的文本值是number。
cts:search(fn:doc(),cts:wordquery(“226”))

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

例如: 这是abc.xml

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

00226
这是abc1.xml

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

226
如果我将查询设置为
cts:search(fn:doc(),cts:word query(“226”))
,它将只获取abc1.xml,如果查询设置为
cts:search(fn:doc(),cts:word query(“00226”)
,它将只获取abc.xml


但是我需要获取这两个文档,而不考虑前导零。

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

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

最简单的方法是使用通配符(*)并添加
通配符
选项

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"))

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

如果我在查询中使用*226,它将匹配以226结尾的任何数字。假设我有5225226。它也将匹配并返回此文档。所以我不能使用通配符。我不能定义long类型的元素范围索引,因为该元素可能包含带有数字的文本。