CTS:元素查询与 CTS:路径范围查询性能



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

早些时候,我们利用路径范围索引使用 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")))))))

我的问题是,

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

  2. 哪个查询适合庞大的数据集?(cts:element-query(( 或cts:path-range-query(((

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

答案并不完全直截了当,这意味着结果可能因数据和数量而异。

不过有几点注意事项:

  • 您的查询在语义上并不相同。元素查询检查祖先,而在路径中你可以更严格,并且需要特定的父级,所以直接的父子关系而不是祖先-后代关系
  • 范围查询针对具有预定义排序规则的范围索引进行解析,并且始终针对整个("精确"(值进行解析。但是,值查询是针对通用索引解析的。更具体地说,针对具有无词干标记的索引。如果您的值由多个代币组成,则需要启用仓位或过滤搜索以确保准确性。但是,示例中的值仅包含一个令牌。
  • 路径范围索引在
  • 摄取时需要付出代价,略大于元素范围索引。范围索引也会占用额外的内存。元素查询和元素值查询在搜索时需要稍微多一些工作来解决。但是,您可能需要一个大的测试集来注意到显着差异。
  • 最后但并非最不重要的一点是,如果没有范围索引,则无法执行不等式查询或分面的值查找。

哼!

最新更新