比方说,我们有不同的部分XML文件:title
,description
,text
,note
。
<book>
<title>Some title</title>
<description>Some description</description>
<text>Some texte</text>
<note>Some note</note>
</book>
假设我们希望能够在这些不同的部分进行查询。这可以通过不同的方法来完成。
例如,我们只想在title
和中查询note
。
方法1(基本详细版本)
for $result in (
collection("path_to_my_collection")//title[ft:query(., "'word_to_search'")]
,
collection("path_to_my_collection")//note[ft:query(., "'word_to_search'")]
)
方法2(从此处获取此方法)
for $result in collection("path_to_my_collection")//(title | note)[ft:query(., "'word_to_search'")]
方法3(该文档似乎建议使用此方法)
let $docs_and_parts :=
for $parts in (collection("path_to_my_collection")//title, collection("path_to_my_collection")//note)
return
$parts
for $result in $docs_and_parts[ft:query(., "'word_to_search'")]
看完XQuery优化技术之后,我想知道这些方法中的哪一种在包含许多(超过100个)文件的大型集合中执行效率更高/速度更快?
我认为本文提到了在为eXists-db编写表达式时要考虑的所有相关方面,例如,避免不必要的嵌套过滤器,宁愿使用XPath谓词而不是where
表达式,使用group by
,一次构造初始节点集,并在查询多个时将其用作主表达式的输入集合..
似乎建议使用第三种方法,因为它遵循了在查询之前构造初始节点集的建议。
但是,方法2似乎仅依靠XPath来解决此问题;可能会更好。
最后,它取决于你的输入数据和优化器的实现细节。遵循一般建议和常识(例如避免嵌套循环等)在大多数情况下应该会有所帮助,但对于关键情况,仍可能需要运行测试并找出在给定情况下最有效的方法。
谢谢您的回答。我认为这种查询有一些XQuery“最佳实践”。因此,最后,通常,有许多“最佳”方法,而这就是在我的特定情况下最有效的方法。我知道了!