cts:element-查询 vs cts:path-范围查询性能

cts:element-query vs cts:path-range-query performance

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

之前我们利用路径范围索引来使用 cts:path-range-query() 来加快搜索速度,但现在我发现我可以获得相同的结果使用 cts:element-query() 而不创建路径范围索引。

例如 -

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

    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() or cts:path-范围查询())

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

答案不完全是 straight-forward,这意味着结果可能因数据和数量而异。

注意事项:

  • 您的查询在语义上不相同。 Element-queries 检查祖先,而在路径中你可以更严格,并要求特定 parents,所以直接 parent-child 而不是 ancestor-descendant 关系
  • 范围查询根据具有预定义排序规则的范围索引进行解析,并且始终针对整个 ('exact') 值。然而,值查询是针对通用索引解析的。更具体地说,针对具有无词干标记的索引。如果您的值由多个令牌组成,则需要启用位置或过滤搜索以确保准确性。不过,您的示例中的值仅包含一个标记。
  • 路径范围索引在摄取时是有代价的,比元素范围索引稍大。范围索引也需要额外的内存。元素查询和元素值查询在搜索时需要更多的工作来解决。不过,您可能需要一个大的测试集才能注意到显着差异。
  • 最后但并非最不重要的一点是,您不能在没有范围索引的情况下进行不等式查询或分面值查找等。

HTH!