使用 eXist-db 中的范围索引提高查询性能

2024-01-16

阅读文档http://exist-db.org/exist/apps/doc/indexing.xml http://exist-db.org/exist/apps/doc/indexing.xml我发现很难理解如何以及是否可以提高“读取”查询的性能(带有两个参数:字符串和整数)。 eXist-db 有默认的结构索引吗?我可以使用“范围索引”改进 2 个参数查询吗?

有关我的 XML 数据库的更多详细信息(请注意,有 2 个不同的数据库只是合并在同一根目录上):

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<db>
    <docs>
        <doc>
            <header>
                <year>2001</year>
                <number>1</number>
                <type>O</type>
            </header>
            <metas>
                <meta>
                    <number>26001</number>
                    <details>
                        <detail>
                            <description>legge</description>
                            <number>19</number>
                            <date>14/01/1994</date>

                        </detail>
                        <detail>
                            <description>decreto legge</description>
                            <number>453</number>
                            <date>15/11/1993</date>
                        </detail>
                    </details>
                </meta>
            </metas>
        </doc>
        <doc>
            <header>
                <year>2001</year>
                <number>2</number>
                <type>O</type>
            </header>
            <metas>
                <meta>
                    <number>26002</number>
                    <details>
                        <detail>
                            <description>decreto legislativo</description>
                            <number>29</number>
                            <date>03/02/1993</date>
                        </detail>
                    </details>
                </meta>
                <meta>
                    <number>26016</number>
                    <details>
                        <detail>
                            <description>decreto legislativo</description>
                            <number>29</number>
                            <date>03/02/1993</date>

                        </detail>
                    </details>
                </meta>
            </metas>
        </doc>
    </docs>



    <full_text_docs>
        <doc>
            <header>
                <year>2001</year>
                <number>1</number>
                <type>O</type>
                <president>ferrari</president>
            </header>
            <text>lorem ipsum ...

            </text>
        </doc>
        <doc>
            <header>
                <year>2001</year>
                <number>2</number>
                <type>O</type>
                <president>ferrari</president>
            </header>
            <text>lorem ipsum......
            </text>
        </doc>
    </full_text_docs>
</db>

这是我的xquery

xquery version "3.0";

let $doc := doc("/db//index_test/test_general.xml")//db/docs/doc
let $fulltxt := doc("/db//index_test/test_general.xml")//db/full_text_docs/doc

return <root> {
  for $a in $doc[metas/meta/details/detail[date="03/02/1993" and number = "29"]]/header
     return $fulltxt[header/year/text()=$a/year/text() and
            header/number/text()=$a/number/text() and
            header/type/text()=$a/type/text()
            ]

} </root>

基本上我只是简单地找到detail/number and detail/date与第一个数据库中的输入匹配,并获取查询第二个数据库的结果。结果全部是<full_text_header>匹配的文档。

我想知道是否可以为字段创建索引number and date以提高性能。请注意,这是我需要优化的唯一查询(我在这个数据库上唯一做的)显然是数字和日期更改:)。

解决方案:要获得清晰的解释,请阅读 joewiz 的答案。我的问题是 .xconf 文件的正确识别。它必须被放置在/db/yourcollectiondir。如果您在创建文件时使用 eXide,则应选择带有模板“eXist-db 集合配置”的 Xml 类型。当您尝试保存文件时,您将看到一个提示“应用配置?”然后单击“确定”。然后运行此 xqueryxmldb:reindex('/db/yourcollectiondir')。 现在,如果一切正常,当您运行涉及索引的 xquery 时,您将在“监视和分析”中看到用法。


正如该文档页面所述,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 版本正在使用我本周末添加的一项功能,称为“去皮”,该功能尝试从查询分析结果中过滤掉其他操作,以帮助用户仅查看以下操作的效果他们自己的查询。此功能仍然只是一个拉取请求,因此运行当前的发行版本,您不会看到相同的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 eXist-db 中的范围索引提高查询性能 的相关文章

  • eXist-db compression:zip 函数是否添加 XML 声明

    我有一个 XQuery 函数可以将一组 XML 文件转换为 HTML 并压缩它们 它在每个文件上运行一个 transform 来创建 元素 从该函数开始 declare function xport make sources path as
  • SQL Server SELECT 转 JSON 函数

    我想输出一个结果SELECT语句作为 JSON 对象 我希望这是一个Function而不是一个存储过程 例如下表用户 id name active 1 Bob Jones 1 2 John Smith 0 会像这样返回 id 1 name
  • 如何将XML文本转换为表格格式

    在下面的示例中 我们尝试将 XML 数据转换为 HTML 但这里我们面临着由于元素不一致而面临的挑战 如 和 Note 如果我们从 中删除 元素 则 xslt 代码可以正常工作 参考网址 https xsltfiddle liberty d
  • 从 XML 列中选择所有 XML 节点

    我有一个带有 XML 列的表 每个条目的 XML 结构都是完全扁平的 甚至没有父标签 这是一个条目的示例
  • 在 SQL Server 中,我可以将多个节点从表插入到 XML 中吗?

    我想根据表中的数据在存储过程中生成一些 XML 以下插入允许我添加许多节点 但它们必须是硬编码或使用变量 sql variable SET MyXml modify insert
  • 如何在 WSO2 ESB 中按故障顺序访问此消息?

    如何访问来自 WSO2 ESB 故障序列 ERROR CODE 中 wso2dss 端标准错误的错误文本 我已经正常了 但是这个 ERROR MESSAGE 给出了 NULL 我怎样才能做到这一点 这是 WSO2DSS 标准错误消息
  • SQL Server XML 添加属性(如果不存在)

    我正在尝试添加一个属性 如果它不存在 它应该很简单 但我对 XML XPath XQuery 等还不熟悉 所以请原谅我的无知 我希望能够传递 XML 数据并修改它 ALTER FUNCTION dbo ConvertXmlData xmlD
  • 在 XQuery 中搜索两个图节点之间的路径

    我正在尝试创建一种算法 用于搜索并返回 xQuery 中图形中两个节点之间的路径 但到目前为止我没有运气 因为它只返回一个节点及其相邻节点 首先 我应该明确该图是一个有向图 每个节点可以有零个 一个或多个原点 在 XML 中 节点仅具有到其
  • SQL Server - XML 的 XQuery

    与其他帖子类似 我需要从表中检索对 Xml 列应用条件的任何行 例如 假设您有一个如下所示的 xml 列
  • SQL:如何获取 XML 数据类型中的属性值?

    我的数据库中有以下 xml
  • BaseX 中的 XQuery - file:write() 之外的 let 语句

    我有以下代码 let fName C Users user Documents Sitemaps Updated Pages Books xml file write fName element titles for x in doc ht
  • 提高 SQL Server 中的 Xquery 性能

    我有一个 Azure SQL 数据库 其中有 1 个表和大量记录 超过 75 000 条 该表包含 XML 数据类型的列 此列如下所示
  • 如何在Marklogic中使用Group By?

    我想在 xquery 中使用 Group By 有人可以告诉我如何在 Marklogic 中使用 Group By 吗 或者 您可以使用调用 XSLTxdmp xslt invoke or xdmp xslt eval MarkLogic
  • 参数的存在数据库基数

    我是exist db 和XQuery 的新手 在exist db中 我有这个站点地图 目录 registranten 包含目录 data 带有xml文件 和两个文件 regBasic xql 和 regSearch xql 我正在尝试使用脚
  • 在 Java 中嵌入 XQuery

    我需要从 Java 中的 MusicXML xml 文件中检索一些详细信息 我设法用java读取xml文件 但通过网络服务 当我运行代码时我必须在线 连接到互联网 我遇到了 XQuery 您可以轻松地从 XML 文件中提取信息 但我需要在j
  • XQuery 中的 element() 与 node()

    有人可以告诉我两者之间的确切区别吗node and element XQuery 中的类型 该文档指出element 是一个元素节点 而node 是任何节点 所以如果我理解正确的话element 是一个子集node 问题是我有一个像这样的
  • 学习 XQuery 的简单工具? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始玩XQuery 在 w3schools 1 上 这是一个很好的教程 我只是遇到一些问题 我无法测试网站上的内容 我在网上找到了一个X
  • XQuery 中有没有办法获取自某个纪元以来的当前时间(以毫秒为单位)?

    XQuery提供各种date time功能类似于current dateTime 但是我似乎找不到一个能让我有时间的毫秒自纪元以来 提取小时 分钟和秒的函数似乎过于独立存在 获取大纪元时间 即unix时间或类似时间 的正确方法是什么XQue
  • 如何在sql中查询xml列

    我在 SQL Server 2008 上有一个表 T1 其中包含一个 XML 列 EventXML 我想查询某个节点包含特定值的所有行 更好的是 我想检索不同节点中的值 表T1 T1 EventID int EventTime dateti
  • 如何使用 try.zorba.io 从 JSON 运行 JSONiq

    我需要编写一个 JSONiq 表达式 仅列出成本至少为 3 的产品的名称 这是我在XQuery部分 supermarket visit date 08032019 bought item type confectionary item na

随机推荐

  • 高尔夫代码:Mandelbrot 集

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 代码高尔夫的通常规则 下面以Python中的实现为例 from PIL import Imag
  • 如何对“process.platform”的程序撒谎?

    有一个在 Node 上运行的 CLI 可以通过以下方式执行command在命令行上 在其代码中 通过以下方式对 Windows 用户停用了某些功能if process platform win32 process exit 1 现在我想禁用
  • 如何匹配特定的 io::Error 类型?

    我试图一次读入一个文件直到最后 2 个字节 并且我想捕获 EOF 错误 use byteorder BigEndian ReadBytesExt 1 3 4 use std fs File fn main let filename etc
  • 使用 ARM TrustZone 防止从非安全世界访问内存区域

    Context 我想拥有一个有钱人GNU Linux操作系统运行在正常的世界和一个带有集成的小型操作系统Monitor运行在安全世界 要求 我们必须绝对避免 the 正常的世界访问安全世界内存区域 Question 具有哪些特征信任区我们需
  • Typescript 和 __proto__ 属性

    因此 每次提到 proto 后通常都会提到 Brendan Eich 请求不要使用它 我一直在使用 Typescript 进行一些反射 使用它将类的原型链导航到提供的祖先类 并且希望注入保存类元数据的单个原型属性 有谁知道我可能产生的性能开
  • 为什么 fileOutputStream 在客户端-服务器应用程序中无法在空行(或换行符)之后输出任何字符串?

    在我的客户端 服务器应用程序中 当我尝试从服务器端下载文件时 该文件会被下载 但无法读取标题信息 例如一些带有换行符的附加文本 正如您在我的服务器类中看到的 以下信息应该在客户端打印出来 outputToClient printf Stat
  • 优秀的图书馆文档

    我在这里找到了很多推荐使用Excel图书馆用于编辑 Excel 文件 但我在任何地方都找不到任何文档 http code google com p excellibrary http code google com p excellibra
  • Qt 鼠标移动事件未被事件过滤器捕获

    我似乎无法在 eventFilter 中捕获 QEvent MouseMove 类型的事件 这是我的事件过滤器 bool MapWidget c eventFilter QObject obj QEvent ev if obj graphi
  • 如何使用主题文件自定义 ASP.NET 图表

    我想创建一个折线图 其中 x 轴是日期 y 轴上有绿色 0 位置 黄色 1 和红色 2 的位置 我怎样才能做到这一点 目前只有数字 我用 XML 尝试过 但我对它了解不多 而且有点令人困惑 我可以用它访问 y 轴的单个元素并将它们转换为文本
  • 将本地时间 (Java 8) 转换为日期

    我正在尝试转换java time LocalTime反对java util Date但找不到合适的方法 这样做的正确方法是什么 java 似乎没有内置直接转换方法 有什么原因吗 对于可能的重复项 如何换算乔达时间 https stackov
  • 在 WPF 中的网格中显示对其他控件的控件

    我正在开发一个 WPF 应用程序 主窗口的子控件包含在网格中 底行包含一个状态栏 应用程序必须通知用户 我想以编程方式在主窗口右下角的用户控件中显示通知 我希望通知用户控件显示在状态栏和上行中的控件上 如何在网格中包含的其他控件上显示一个控
  • 在网络浏览器中嵌入 Youtube 视频。对象不支持属性或方法

    YouTube 最近停止支持以 www youtube com v key 格式嵌入的视频 所以我试图将视频从 v 转换为 embed 但是 当我尝试导航到视频时 会弹出以下错误 我使用以下命令导航到该网页 WPF
  • 在C++中重载operator[],但要防止a[i]=one_special_specific_value

    我正在实现 Spare Vector ADT 并且想要重载运算符 我有一个 int 和 double 对的列表 我想通过例如创建新节点 5 3 5 a 5 3 5 但我想让它不可能为其中一个节点分配 0 值 因为它应该是一个备用向量 所以当
  • Android 设备:“new ServerSocket(6000)”上的权限被拒绝异常

    我收到 权限被拒绝 异常new ServerSocket 6000 在 Android 设备中 我读过很多帖子 其中说你必须把android permission INTERNET清单中的许可 我已经获得了此许可 并且仍然收到此消息 Non
  • 级联类型.ALL 不起作用

    我已在实体关系中设置了 CascadeType ALL 但每当我保留实体时 它都会部分起作用 前任 会员实体 OneToMany mappedBy member cascade CascadeType ALL private List
  • 对许多 PostgreSQL 查询进行基准测试

    在复杂的网页上会执行数百个查询 我正在寻找一种方法来对这些查询进行基准测试 我尝试嵌入解释分析进入查询resp 进入 psql 函数 选择每个查询的执行时间并进行比较 但解释分析似乎无法以任何方式嵌入 是否有其他解决方案来比较某些查询的执行
  • 从 .txt 中读取单词,并对每个单词进行计数

    我想知道如何像 fscanf 那样读取字符串 我需要在 all txt 中逐字阅读 我需要对每个单词进行计数 collectwords collections defaultdict int with open DatoSO txt r a
  • 正则表达式捕获分隔符之间的字符串

    In this https stackoverflow com questions 1454913 regular expression to find a string included between two characters wh
  • 使用什么数据库来存储和操作大数据?

    我必须决定为我的下一个项目使用哪个数据库服务器 但是像我所做的几乎所有项目一样使用 MySQL 的简单决定现在变得更加困难 因为我期望非常多的记录 数据库会存储一个用户列表 一些其他不相关的表 最后一个是一些用户收集的数据 比方说 如果我有
  • 使用 eXist-db 中的范围索引提高查询性能

    阅读文档http exist db org exist apps doc indexing xml http exist db org exist apps doc indexing xml我发现很难理解如何以及是否可以提高 读取 查询的性