在MarkLogic中搜索XML文档以获取处理指令

时间:2018-08-31 12:09:57

标签: xquery marklogic processing-instruction

我有以下代码:

cts:and-query((
cts:element-word-query(xs:QName("primaryie"), $textname, "case-insensitive"),
cts:element-query(xs:QName("beginpage"),
cts:and-query(()))
))

,但想添加一个cts:or-query来查找高样式的“文档页面”,但无法弄清楚该使用什么。我尝试过cts:element-query,但我认为这不是要素。好像是标记物或其他东西。有什么建议吗?

enter image description here

1 个答案:

答案 0 :(得分:2)

当前没有一种方法可以在processing-instruction()上创建索引(使用path-range-index或其他方式)。

如果您已经利用envelope pattern,则可以将processing-instruction()作为信封中的元素,即<docpage num="i"/>,然后使用cts:element-attribute-value-query()

cts:and-query((
  cts:element-word-query(xs:QName("primaryie"), $textname, "case-insensitive"),
  cts:or-query((
    cts:element-query(xs:QName("beginpage"),
    cts:element-attribute-value-query(xs:QName("docpage"), xs:QName("num"), "i")
  ))
))

或者您可以创建文档属性,然后使用cts:properties-fragment-query()

cts:and-query((
  cts:element-word-query(xs:QName("primaryie"), $textname, "case-insensitive"),
  cts:or-query((
    cts:element-query(xs:QName("beginpage"),
    cts:document-fragment-query(
      cts:element-attribute-value-query(xs:QName("docpage"), xs:QName("num"), "i")
    )
  ))
))

否则,您将需要通过XPath对搜索结果执行过滤。

cts:search(doc(),
  cts:element-word-query(xs:QName("primaryie"), $textname, "case-insensitive")
)[book/(beginpage or processing-instruction("docpage") = 'num="i"')]

这将需要过滤(读取匹配的文档),因此此查询响应的速度将取决于从搜索条件返回的文档数量,以及对要返回的文档数量的限制。