gpt4 book ai didi

使用 OR 在 MarkLogic 上进行 Xquery

转载 作者:行者123 更新时间:2023-12-02 04:32:12 25 4
gpt4 key购买 nike

这是一个 MarkLogic 新手问题。想象一下像这样的 xml 结构,它是我真正的业务问题的浓缩:

<Person id="1">
<Name>Bob</Name>
<City>Oakland</City>
<Phone>2122931022</Phone>
<Phone>3123032902</Phone>
</Person>

请注意,一个文档可以并且将会有多个 Phone 元素。

我需要从每个文档中返回信息,该文档中的Phone元素与电话号码列表中的ANY相匹配。该列表中可能有几十个电话号码。

我已经尝试过这个:

let $a := cts:word-query("3738494044")
let $b := cts:word-query("2373839383")
let $c := cts:word-query("3933849383")
let $or := cts:or-query( ($a, $b, $c) )
return cts:search(/Person/Phone, $or)

它正确执行查询,但它返回 Results 元素内的一系列 Phone 元素。我的目标是为每个匹配文档返回所有 NameCity 元素以及 Person 元素中的 id 属性。示例:

<results>
<match id="18" phone="2123339494" name="bob" city="oakland"/>
<match id="22" phone="3940594844" name="mary" city="denver"/>
etc...
</results>

所以我认为我需要某种形式的cts:search,它既允许这种 bool 功能,还允许我指定返回每个文档的哪些部分。那时我可以使用 XPATH 进一步处理结果。我需要有效地执行此操作,因此例如我认为返回文档 uri 列表然后循环查询每个文档的效率不高。谢谢!

最佳答案

你的方法并不像你想象的那么糟糕。只需进行一些更改即可使其按您的意愿工作。

首先,您最好使用 cts:element-value-query 而不是 cts:word-query。它将允许您将搜索值限制为特定元素。当您为该元素添加元素范围索引时,它的性能最佳,但这不是必需的。它也可以依赖于始终存在的单词索引。

其次,不需要cts:or-querycts:word-querycts:element-value-query 函数(以及所有其他相关函数)都接受多个搜索字符串作为一个序列参数。它们会自动被视为或查询

第三,电话号码是结果中的“主键”,因此返回所有匹配 Phone 元素的列表是正确的方法。您只需要意识到生成的 Phone 元素仍然知道它们来自哪里。您可以轻松地使用 XPath 导航到父级和同级。

第四,没有什么反对循环搜索结果的。这可能听起来有点奇怪,但它不会花费太多额外的性能。实际上,在 MarkLogic Server 中,它几乎可以忽略不计。当您尝试返回许多结果(超过数千个)时,大多数性能可能会损失,在这种情况下,大部分时间都浪费在序列化所有结果上。如果您可能需要处理大量搜索结果,那么立即开始使用分页是明智的。

要得到您所要求的内容,您可以使用以下代码:

<results>{
for $phone in
cts:search(
doc()/Person/Phone,
cts:element-value-query(
xs:QName("Phone"),
("3738494044", "2373839383", "3933849383")
)
)
return
<match id="{data($phone/../@id)}" phone="{data($phone)}" name="{data($phone/../Name)}" city="{data($phone/../City)}"/>
}</results>

祝你好运。

关于使用 OR 在 MarkLogic 上进行 Xquery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7534218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com