我正在我的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。
我需要微调此查询的帮助,以便它返回页面中的值。
答案 0 :(得分:3)
您可以使用几个选项来优化此查询。
base__unique_id
实际上是唯一的ID,您可以在其上放置范围索引,并使用cts:element-values
返回查询中的所有现有值。这将是一个更快的查询,并且将使用更少的内存,因为您不会打开所有返回的文档。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通过两个步骤执行搜索:
直接从索引中识别候选片段(文档)ID。这是在内存中完成的,而且速度很快。结果可能包含误报。
从磁盘中加载了候选片段ID,并针对所有搜索条件进行了彻底检查,以滤除误报。这是在内存中完成的,而且很慢。
如果您想加快搜索速度并且可以容忍假阳性,则可以通过执行未过滤的搜索来跳过第二步,仅从索引中解析候选片段:
let $all-docs := cts:search(doc(), cts:and-query(()), "unfiltered")
return $all-docs[1 to 10]
答案 3 :(得分:-1)
使用“未过滤”选项。这将使索引解析步骤停止搜索,从而不允许筛选文档。过滤文档意味着一步一步地解压缩文档片段以搜索将使用扩展的树缓存的术语。给定结果数量,最好选择此选项。