有没有一种方法可以搜索一个路径范围索引等于另一个路径范围索引的文档?

时间:2019-01-11 10:49:06

标签: marklogic

我想获取所有路径范围索引值等于同一文档中另一个值的所有文档 (例如:/ metadata / book-title = / metadata / chapter-title)。有办法吗?

2 个答案:

答案 0 :(得分:5)

一个显而易见的想法是将一个字段上的cts:values结果馈送到另一个字段上的所谓的Shotgun-OR查询中,但是这不能确保文档中两个字段都相等。之后,您必须手动使用XPath过滤误报,这不是很理想。

更好的方法是使用Optic API。这样的事情可以让您了解如何工作:

import module namespace op="http://marklogic.com/optic"
     at "/MarkLogic/optic.xqy";

op:from-lexicons(
  map:new((
    map:entry("bookTitle", cts:element-reference(xs:QName("book-title"))),
    map:entry("chapterTitle", cts:element-reference(xs:QName("chapter-title"))),
    map:entry("uri", cts:uri-reference())
  )),
  "books"
)
 => op:where(
      op:eq(
        op:view-col("books", "bookTitle"),
        op:view-col("books", "chapterTitle")
      )
    )
 => op:result() 

如果与您的索引匹配,则可以用其他引用(例如路径引用)替换element-references。

HTH!

答案 1 :(得分:2)

是-您将cts:values([参考到您的path-range-index])的结果传递给另一个cts:range-query

let $title-list := cts:values(cts:path-reference("/metadata/book-title"))
let $match-query := cts:range-query(
  cts:path-reference("/metadata/chapter-title"),
  "=",
  $title-list
)

然后在较大的查询中使用$ match-query。

请注意,这只是一个简单的例子。实际上,您可能会使用查询选项以及查询范围cts:values()的结果来调整完整查询和cts:values()。

还请注意,还有一个cts:path-range-query()而不是range-query,它可能更方便。但是,我尝试使我的代码保持通用性(不关心索引中数据的来源,因为实现细节可能会随时间变化)。