MarkLogic:XDMP-UNSEARCHABLE 错误或可搜索路径表达式

MarkLogic: XDMP-UNSEARCHABLE error or searchable path expression

帮助我理解"fully searchable path expression"。无法搜索的路径表达式示例如下:

xquery version "1.0-ml";
(:constructed sequence :)
cts:search((<last_name>Mortensen</last_name>,<last_name>Hurt</last_name>,<last_name>Bello</last_name>),cts:word-query("Bello"))

使用 $doc/movies//country 等变量的 XPATH 表达式(在 "Xquery" Priscilla Walmsley 书中称为 "dynamic path")

使用不同于 child:: 或 descendant:: 的 XPath 轴的 XPATH 表达式,例如:

cts:search(doc("doc/movies")/descendant::year[. = '1995']/parent::movie ,cts:word-query("Tom Stall"))

或 参见示例 MarkLogic: Understanding searchable and unsearchable queries?

"searchable path expression" 的正式定义是什么?

可搜索路径表达式含义的明确示例在方便命名的部分下定义 'Fully Searchable Paths and cts:search Operations'..

查看您的代码,我建议您通读 Search Developer's Guide. For convenience, here is the deep link to the cts:search section

此外,您提到了 xQuery 并参考了一本书或其他文献。 xQuery 有很多版本——当前的 W3C 推荐版本是 version3.1。您可能想看看 MarkLogic 的 描述 implementation 因为它最初源自 1.0 方言,并且多年来得到了增强。

编辑: 用户此后要求更多指导 通过评论。以下是基于原始代码示例的(许多)可能解决方案之一:

xquery version "1.0-ml";
(:constructed sequence :)
let $last-name := ('Mortensen','Hurt','Bello')
return cts:search(fn:collection(),cts:and-query(
            (
              cts:element-word-query(xs:QName('last-name'),  $last-name),
              cts:word-query("Bello")
            )
          )
         ) 

cts:search 有一些特别之处。您需要了解在调用 cts:search 之前不会评估第一个参数。相反,表达式本身被传递到数据层,然后数据层尝试主要使用索引来解析表达式。

这就是为什么您不能提供构造的节点,也不能提供包含数据层未知的变量的 XPath 表达式。所以,这就是它说 (un)searchable expressions 的原因。 performance guide(也被 David Ennis 引用)是这样说的:

A fully searchable XPath expression is one that can be efficiently resolved using the indexes.

为了让您的生活更轻松,请尝试尽可能使用 collection() 作为第一个参数,并通过查询参数提供任何其他约束。

如果您需要过滤构造的节点,或另一个表达式的结果,请考虑使用 cts:contains

HTH!