在Marklogic中,cts:word查询中的数字意义是什么?

3

我有一个 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个回答

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

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

如果我在查询中使用*226,它将匹配任何以226结尾的数字。假设我有5225226。它将匹配并返回此文档。因此,我不能使用通配符。 - Kishan Ashra

4

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

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

我无法定义一个类型为long的元素范围索引,因为该元素<b>可能包含文本和数字。 - Kishan Ashra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接