正如该文档页面所述,eXist 确实为数据库中存储的所有 XML 创建了结构索引。不过,这不是值的索引,因此如果没有进一步的索引,基于值(而不是结构)的查询将涉及在 DOM 中查找值。随着数据变得越来越大,在 DOM 中查找值会变得越来越慢。这就是基于值的索引(例如范围索引)可以挽救局面的地方。 (有关更完整的解释,请参阅“索引” http://exist-db.org/exist/apps/doc/tuning.xml#D2.2.5Wolfgang Meier 的“调整数据库”一文的部分,这对于充分发挥 eXist 的性能至关重要。)
所以,是的,您可以为<number>
and <date>
字段。我建议使用“新范围”索引,如该文档页面上所述。你的collection.xconf
设置这些索引的文件如下所示:
<collection xmlns="http://exist-db.org/collection-config/1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<index>
<range>
<create qname="number" type="xs:integer"/>
<create qname="date" type="xs:string"/>
</range>
</index>
</collection>
您必须将其存储在/db/system/config/
集合,位于与数据库中数据位置相对应的子集合中。因此,如果您的数据位于/db/apps/myapp/data
,你会把这个collection.xconf
文件输入/db/system/config/db/apps/myapp/data
.
请注意,此处的配置只会影响for
子句的查询date
and number
值,而不是谓词return
子句,这取决于值<year>
and <type>
元素。因此,为了确保您的查询最大化索引的使用,您应该在这些上声明索引;看起来xs:integer
将是适合每个的类型。
最后,我建议消除/text()
步骤,这是完全无关的。有关使用/滥用的更多信息text()
,请参阅 Evan Lenz 的文章,“text() 是一种代码味道” https://developer.marklogic.com/blog/text-is-a-code-smell.
Update(2016-07-17):通过上面更新的代码示例,我有一些额外的建议。首先,由于代码位于/db/index_test
,我们将按如下方式存储我们的文件:
假设您使用 eXide,当您存储collection.xconf
集合中的文件,eXide 将提示您将该文件的副本放置在正确的位置/db/system/config
。如果您不使用 eXide,则需要存储collection.xconf
你自己在那里归档。
使用未经修改的查询,我可以确认尽管存在collection.xconf
文件中,monex 显示没有应用任何索引:
让我们对文件进行一些修改,以确保正确应用索引:
xquery version "3.0";
<root> {
for $a in doc("/db/index_test/test_general.xml")//detail[date = "03/02/1993" and number = 29]/ancestor::doc/header
return
doc("/db/index_test/test_general.xml")/db/full_text_docs/doc
[
header/year = $a/year and
header/number = $a/number and
header/type = $a/type
]
} </root>
通过这些修改,monex 表明索引应用于for
clause:
这里的见解源自“调整数据库”一文。要获得所有比较的完整索引,您将需要定义其他索引,并且可能需要对查询进行类似的修改。
最后一点:您在这些图片中看到的 monex 版本正在使用我本周末添加的一项功能,称为“去皮”,该功能尝试从查询分析结果中过滤掉其他操作,以帮助用户仅查看以下操作的效果他们自己的查询。此功能仍然只是一个拉取请求,因此运行当前的发行版本,您不会看到相同的结果。