温馨提示:本文翻译自stackoverflow.com,查看原文请点击:marklogic - cts:element-query vs cts:path-range-query performance
marklogic marklogic-9

marklogic - cts:element-query与cts:path-range-query性能

发布于 2020-04-14 11:30:58

我们正在开发一个存储大量数据的企业应用程序。在我们的应用程序中,我们强迫用户创建多个路径范围索引,以加快搜索速度。

早些时候,我们利用路径范围索引来使用cts:path-range-query()加快搜索速度,但是现在我发现使用cts:element-query()可以得到相同的结果,而无需创建路径范围索引。

例如 -

  1. 使用cts:path-range-query() ->在这里,我需要为/ tXML / Message / INVENTORY / ASNId创建路径范围索引

    xquery version "1.0-ml"; cts:uris('', (), cts:and-query((cts:collection-query("integration"), cts:path-range-query("/tXML/Message/INVENTORY/ASNId", "=", "10121600"))))

  2. 使用cts:element-query() ->在这里,我不需要创建路径范围索引。

    xquery version "1.0-ml"; cts:uris('', (), cts:and-query((cts:collection-query("integration"), cts:element-query(xs:QName("tXML"),cts:element-query(xs:QName("Message"), cts:element-query(xs:QName("INVENTORY"), cts:element-value-query(xs:QName("ASNId"), "10121600")))))))

我的问题是

  1. 如果使用cts:element-query()获得与cts:path-range-query()相同的结果,那么为什么我需要强制用户创建路径范围索引?

  2. 哪个查询适合大量数据?(cts:element-query()cts:path-range-query()

请帮助我找到这两个问题的答案。

查看更多

提问者
Shivling Bhandare
被浏览
95
grtjn 2020-02-03 19:23

答案并不完全简单,这意味着结果可能会因数据和数量而异。

不过有几点注意事项:

  • 您的查询在语义上是不同的。元素查询检查祖先,而在这条路径上您可以更严格,并且需要特定的父母,因此直接父子关系而不是祖先后代关系
  • 范围查询根据具有预定义归类的范围索引进行解析,并且始终针对完整(“精确”)值进行解析。值查询是针对通用索引而解决的。更具体地说,针对带有未阻塞令牌的索引。如果您的值包含多个标记,则需要启用头寸或进行筛选搜索以确保准确性。尽管示例中的值仅包含一个令牌。
  • 路径范围索引是在摄取时付出代价的,略大于元素范围索引。范围索引也会占用额外的内存。元素查询和元素值查询在搜索时需要花费更多的精力来解决。但是,您可能需要一个大型测试集才能注意到明显的差异。
  • 最后但并非最不重要的一点是,如果没有范围索引,您将无法进行不等式查询或无法对方面进行值查询。

HTH!