无法理解在 Marklogic 中使用 XQuery 的 CTS 查询

Trouble understanding CTS queries using XQuery in Marklogic

我正在尝试使用 cts:search() 来理解 cts:element-querycts:element-value-querycts:element-word-query 之间的区别。

当有人可以使用所有这三个来实现同样的事情时,为什么他们创造了这么多?

我确定我在这里遗漏了一些需要理解的东西。我有以下数据:

<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
  </CD>
  <CD>
    <TITLE>Hide your heart</TITLE>
    <ARTIST>Bonnie Tyler</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>CBS Records</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1988</YEAR>
  </CD>
  <CD>
    <TITLE>Greatest Hits</TITLE>
    <ARTIST>Dolly Parton</ARTIST>
    <COUNTRY>EU</COUNTRY>
    <COMPANY>RCA</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1982</YEAR>
  </CD>
</CATALOG>

我想过滤“欧盟”国家的数据。我可以使用下面列出的任何查询实现相同的目的。

那么有什么区别呢?什么时候用什么?有人可以帮我理解吗?

我的理解是将 cts:searchcts:element-query 一起使用。我正在研究其他查询是否也可以使用其他查询获得相同的结果。 (我已经浏览了我仍然不理解的文档)。有人可以给我一个简单的解释吗?

这三个 cts:element-* 查询函数有一些重叠的功能,有可能得到相同的结果,但有一些关键差异会影响可能的结果以及查询的效率你的系统。

  • cts:element-query()是容器查询。它匹配第一个参数中指定的元素。来自第二个参数的查询应用于匹配元素 及其所有后代 。所以 cts:word-query 将匹配 COUNTRY 的文本或任何后代元素,如果有更复杂的结构。

    使用xdmp:plan()查看查询计划,

    xdmp:plan(cts:search(//CD,cts:element-query(xs:QName("COUNTRY"),"EU")))
    

    您可以看到该计划具有应用无约束词查询的条件:

    <qry:term-query weight="1">
      <qry:key>17785254954065741518</qry:key>
      <qry:annotation>word("EU")</qry:annotation>
    </qry:term-query>
    
  • cts:element-value-query() 仅匹配文本内容与来自第二个参数的短语。

    该查询的 xdmp:plan()

    xdmp:plan( cts:search(//CD,cts:element-value-query(xs:QName("COUNTRY"),"EU")) )
    

    显示有一个值专门应用于 COUNTRY 元素:

    <qry:term-query weight="1">
      <qry:key>9358511946618902997</qry:key>
      <qry:annotation>element(COUNTRY,value("EU"))</qry:annotation>
    </qry:term-query>
    
  • cts:element-word-query() 类似于 cts:element 值查询,不同之处在于它仅搜索指定元素 的直接文本节点子节点以及管理界面中定义为元素词查询直通或短语直通 的子元素的任何文本节点子级。它不会搜索指定元素的任何其他子元素。

    该查询的 xdmp:plan()

    xdmp:plan( cts:search(//CD,cts:element-word-query(xs:QName("COUNTRY"),"EU")) )
    

    表明有一个词查询专门应用于 COUNTRY 元素:

    <qry:term-query weight="1">
      <qry:key>6958980695756965065</qry:key>
      <qry:annotation>element(COUNTRY,word("EU"))</qry:annotation>
    </qry:term-query>
    

    cts:element-word-query 如果您有混合内容和您希望在搜索时能够“看穿”的特定元素的已知词汇表,则最有帮助。一个示例是 MS Word 或 XHTML 标记,其中包含用于应用样式和格式设置的元素包装文本,例如 [=30] 内的 <b><i><u> =] 并且您想在给定段落中搜索一个词,然后 搜索 biu 子元素。

对于此特定实例,要在特定元素中搜索值,您应该使用:

cts:search(//CD,cts:element-value-query(xs:QName("COUNTRY"),"EU")) 

这是告诉 MarkLogic 您要在 COUNTRY 元素(而不是它的任何子元素或后代)中搜索值“EU”的最具体和最有效的方法。