【问题标题】:searching in multiple collections joined by common fileds in xquery marklogic在 xquery marklogic 中由公共字段连接的多个集合中搜索
【发布时间】:2019-07-23 09:00:50
【问题描述】:

我有两个集合(“A”和“B”),其中包含数百万个运输保险数据文档。这两个集合有四个共同元素(客户编号、保险日期、保险编号、事故编号),一个元素(许可证编号)仅存在于一个集合('A')中。我想提取两个集合中存在的所有文档,并且还具有集合'A'的元素。我可以使用 cts-search 从“A”中检索所有客户编号。然后我遍历每个客户编号以在“A”中查找许可证编号。它给出了一个空序列。但我知道这是不可能的。有人可以用适当的搜索逻辑指导我吗?

    let $col-A :=  cts:search(
   doc(),
    cts:and-query((
         cts:collection-query('col-A'),
        cts:element-value-query(xs:QName('abc:Acusno'), '*', (("wildcarded")))

    )))

  for $each in $col-A
  let $col-B := cts:search(doc(),
      cts:and-query((cts:collection-query('col-B'),
     cts:element-value-query(xs:QName('abc:Bcusno'), $each)
   )))

 return $col-B

返回空序列

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    您的第一个 cts:search 将返回整个文档,然后您将其作为参数传递给值查询。您可能只想传入abc:Acusno 的值。您可以使用 $each//abc:Acusno 之类的东西来做到这一点。

    您的代码没有使用非常有效的方法,如果某些 Acusno 值多次出现怎么办?

    我建议在abc:Acusno 上放置一个范围索引,并使用cts:values 提取与给定查询匹配的唯一值。然后将整个列表作为一个参数提供,而无需循环到针对abc:Bcusno 的查询。您不必在 Bcusno 上使用范围索引和范围查询,但无论如何拥有该索引可能很有用。然后代码将如下所示:

    let $query :=
      cts:and-query((
        cts:collection-query('col-A'),
        cts:element-query(xs:QName('abc:Acusno'), cts:true-query())
      ))
    
    let $customerNrs :=
      cts:values(
        cts:element-reference(xs:QName("abc:Acusno")),
        (),
        (),
        $query
      )
    
    return cts:search(
      collection(),
      cts:and-query((
        cts:collection-query('col-B'),
        cts:element-range-query(xs:QName('abc:Bcusno'), '=', $customerNrs)
      ))
    )
    

    注意:返回这样的完整搜索列表时要小心。您可能需要对响应进行分页。

    HTH!

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多