在marklogic

时间:2018-07-23 12:44:57

标签: xquery marklogic

我正在我的MarkLogic应用程序的查询控制台上运行以下查询,在此基础上,我将检索与筛选器查询匹配的那些文档的ID。我将在执行时完全遇到扩展树缓存。
我的查询:

let $a: = cts:search(doc(),
  cts:element-query(xs:QName("doc__doc_type"), cts:and-query(()))
)
for $doc in $a
return ($doc//base__unique_id/text())

如何微调此查询?

与此查询匹配的文档数为1336967。 配置的树大小为2048MB。

我需要微调此查询的帮助,以便它返回页面中的值。

4 个答案:

答案 0 :(得分:3)

您可以使用几个选项来优化此查询。

  • 最佳选择:假设base__unique_id实际上是唯一的ID,您可以在其上放置范围索引,并使用cts:element-values返回查询中的所有现有值。这将是一个更快的查询,并且将使用更少的内存,因为您不会打开所有返回的文档。
  • 分页显示您的结果。不要一枪返回所有结果。在几个查询过程中执行此操作。如果您只是生成所有结果的列表,还可以查看CORB2,以帮助您以可扩展的方式进行操作。
  • 如果有必要,可以考虑根据文档类型为数据分配名称空间。这样可以生成较小的术语列表(提高性能),并且可以简化许多查询表达式。
  • 如果您没有遵循我的第一个建议,则可以尝试使用绝对XPath表达式,而不是现在使用的相对表达式。
  • 如果您没有遵循我的第一个建议,则可以将cts:search设为未过滤。这将有助于加快结果的速度,但可能无法解决扩展的树缓存错误。

答案 1 :(得分:1)

如果您无法轻松创建索引,并希望避免在翻阅所有文档时炸开扩展的树缓存...

它可能不是最快的(并且您可能需要提高超时限制),但是通过消除FLWOR语句并使用以下表达式,您可以避免 XDMP-EXPNTREECACHEFULL 错误不需要缓冲任何文档或值,例如:

cts:search(doc(),
  cts:element-query(xs:QName("doc__doc_type"), cts:and-query(()))
)//base__unique_id/text()

答案 2 :(得分:0)

您可以通过以下方式对cts:search返回的序列进行子排序来对cts:search的结果进行分页:

let $a := cts:search(doc(), cts:element-query(xs:QName("doc__doc_type"),cts:and-query(())) ) 
let $page1 := $a[1 to 10]
let $page2 := $a[11 to 20]
return $page1

背景

有关更多详细信息,请参见documentation有关分页和过滤的搜索。

默认情况下,MarkLogic cts:search API通过两个步骤执行搜索:

  1. 直接从索引中识别候选片段(文档)ID。这是在内存中完成的,而且速度很快。结果可能包含误报。

  2. 从磁盘中加载了候选片段ID,并针对所有搜索条件进行了彻底检查,以滤除误报。这是在内存中完成的,而且很慢。

如果您想加快搜索速度并且可以容忍假阳性,则可以通过执行未过滤的搜索来跳过第二步,仅从索引中解析候选片段:

let $all-docs := cts:search(doc(), cts:and-query(()), "unfiltered")
return $all-docs[1 to 10]

答案 3 :(得分:-1)

使用“未过滤”选项。这将使索引解析步骤停止搜索,从而不允许筛选文档。过滤文档意味着一步一步地解压缩文档片段以搜索将使用扩展的树缓存的术语。给定结果数量,最好选择此选项。