我正在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。
我需要微调此查询的帮助,以便它返回页面中的值。
您有几个选项可用于优化此查询。
base__unique_id
实际上是唯一ID,您可以在其上放置范围索引,并使用cts:element-values
返回查询中的所有现有值。这将是一个更快的查询,并且将使用更少的内存,因为您不会打开所有返回的文档。cts:element-values
以帮助您以可扩展的方式进行此操作。如果无法轻松创建索引,并希望避免翻录所有文档时炸开扩展的树缓存...
这可能不是最快的(并且可能需要提高超时限制),但是通过消除FLWOR语句并使用不需要执行以下操作的表达式,可以避免XDMP-EXPNTREECACHEFULL错误。缓冲任何文档或值,例如:
cts:search
您可以通过以下方式对cts:search(doc(),
cts:element-query(xs:QName("doc__doc_type"), cts:and-query(()))
)//base__unique_id/text()
返回的序列进行子序列化来从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
关于分页和过滤的搜索。
默认情况下,MarkLogicdocumentationAPI通过两个步骤执行搜索:
直接从索引中识别候选片段(文档)ID。这是在内存中完成的,而且速度很快。结果可能包含误报。
候选片段ID从磁盘装入,并针对所有搜索条件进行彻底检查以滤除误报。这是在内存中完成的,速度很慢。
[如果您想加快搜索速度并且可以容忍假阳性,则可以通过执行未过滤的搜索来跳过第二步,仅从索引中解析候选片段:
cts:search
使用“未过滤”选项。这将使索引解析步骤停止搜索,从而不允许筛选文档。过滤文档意味着一步一步地解压缩文档片段以搜索将使用扩展的树缓存的术语。给定结果数量,最好使用此选项。