XML搜索 - 快速,节点内的文本或文本作为属性值

时间:2014-07-25 11:52:58

标签: xml xquery basex

不知道这是一个正确的问题,但好奇心,我想知道哪些将被快速搜索。对于前 -

<A>
  <Name>John</Name>
</A>

<A>
  <Name n="John"/>
</A>

我已将数百万个文本存储为属性值,但字符大小不够大。以上只是更好地理解问题的一个例子。

现在如果使用像BaseX,eXists等XML数据库,我会尝试搜索或创建所有名称的索引,然后更快?

1 个答案:

答案 0 :(得分:2)

这是依赖于实现的,因此无法对所有XML数据库进行概括。虽然在这个简单的例子中,我想所有数据库都是一样的:没关系。

我将为BaseX解释将要发生的事情。假设您使用第一个结构,并且想要获取<A/>元素。所以你使用像

这样的XPath
//A[Name = "John"]

这将针对以下查询进行优化:

db:text("your-database", "John")/parent::*:Name/parent::*:A

而第二个数据结构的XPath可能看起来像这样:

//A[Name/@n = "John"]

将被优化为

db:attribute("your-database", "John")/self::*:n/parent::*:Name/parent::*:A

正如您所看到的,除了一个路径更多(因为您必须访问该属性),这是非常便宜的,主要区别在于使用db:text()db:attribute()。但是作为documented,这两个函数都将使用值索引(如果存在)(默认情况下是这样),并且由于索引查找,它将非常快。

实际上,如果您正在设计基于XML的应用程序并希望以后使用XQuery检索信息,那么您肯定会遇到其他瓶颈,例如:非索引使用查询或嵌套for循环。