【问题标题】:searching within XML files在 XML 文件中搜索
【发布时间】:2019-01-26 18:40:19
【问题描述】:

我有大约 250K XML 文件,每个文件都以 UUID 命名,我想对这些文件进行全文搜索并识别匹配文件的 UUID。在nodejs 环境中索引它们的最佳策略是什么?

我可以将文件导入某个数据库(比如 SQLite),然后使用全文搜索模块(在 SQLite 的情况下为 FTS5)。但我不得不以某种方式忽略 XML 标记。

或者,我可以为 nodejs 使用某种 XMLPath 模块来仅提取文本并将其与文件名一起存储在数据库中,等等。

或者,如果我可以完全避免导入数据库,那就更好了,因为这样我就不必处理将新记录导入数据库的复杂性。

欢迎提出策略建议。

【问题讨论】:

  • 很大程度上取决于您的要求,包括您要将应用部署到的环境。如果您已经习惯使用 SQLite - 太好了。否则,您可能希望考虑类似 Lucene: npmjs.com/package/lucene

标签: javascript node.js xml


【解决方案1】:

分为三个步骤:

  1. 使用 XML 解析器读取 XML 文件

  2. 将 UUID 和文件位置记录到 db 表中(ID(INT)、UUID(varchar 唯一)、文件位置 (json))。如果 UUID 存在,则将文件添加到文件位置列中

  3. 处理后,您将拥有同一行中具有相同 UUID 的所有文件位置。

您可以查看我的npm: XML解析器link

【讨论】:

  • 是的,但是如何进行全文搜索?如何找到所有带有“foo”一词的文件?
  • @punkish 使用正则表达式搜索包含“foo”的每条记录npmjs.com/package/regex
【解决方案2】:

根据您对 Marcia Ong 的回答,我不再确定您的问题究竟是什么。所以这是“大图”:

  1. 您有一堆包含大量信息的 XML 文件。 检索信息的最有效方法是以某种方式索引这些文件。

  2. “索引”的先决条件是“解析”XML。我相信这就是 Marcia Ong 回复的要点。听起来是个好建议。

  3. 另一个问题:如何构建索引。 IS 你的索引是什么?这就是我评论的要点。 SQLite + FTS5 可能是一个不错的选择,Lucene 也可以。你有很多选择。很大程度上取决于您的要求,包括您要将应用部署到的环境。

  4. 还有一个需要考虑的问题:您希望将 XML 物理存储在与索引相同的位置(例如 SQLite 数据库),还是您的索引只是“链接”到 XML 文件?例如,网络共享上的文件路径,或 Web 服务器上的相对路径等。

  5. 最后一期:问:你的应用如何查询索引,并返回结果?答:“这取决于”。这完全取决于您选择索引的技术、应用程序的编程语言、您实际希望从 XML 中检索的信息以及许多其他变量。

  6. 例如:

    1. 假设您在 Linux 服务器上,并假设您选择 Lucene(SQLite 也可以在 Linux 上运行,顺便说一句...)

    2. 您可能有一个夜间批处理作业来解析您的 XML 文件并更新您的索引。

    3. 您的应用可能会执行以下操作之一:

      1. 查询Lucene识别文件,
      2. 使用 NPM XML 包将链接加载为 XML 文档,然后
      3. 使用相同的 XML 库对您希望从 XML 文件中读取的特定数据进行 XPath 查询。

【讨论】:

    【解决方案3】:

    您应该将 XML 文件加载到 XML 数据库中。今天最流行的 XML 数据库似乎是 BaseX、eXist 和 MarkLogic。前两个是开源的,最后一个是商业的。我相信它们都提供全文搜索功能以及(并与)XQuery 集成。您将需要配置所选数据库以定义您希望数据索引的方式。

    (Oracle、SQL Server 和 DB2 等关系数据库也提供 XML 插件,但由于复杂性,我不会走这条路)。

    【讨论】:

      【解决方案4】:

      我决定使用 SQLite3/FTS5 路线。我用xml2js 解析XML 文件并将它们存储在SQLite 中。我有一个带有全文索引的虚拟表,我可以快速搜索。在Michael Kay'ssuggestion 上,我尝试了BaseX,但根本没有可比性。 BaseX 花了约 32 分钟导入约 250K XML 文件以创建约 6GB 的数据库。搜索一个词花了 2m 44s。带有 FTS5 表的 SQLite 数据库约为 9GB。相同的搜索需要 0.001 秒。

      BaseX

      时间:
      - 解析:34.15 毫秒
      - 编译:28.32 毫秒
      - 评估:163172.13 毫秒
      - 打印:537.65 毫秒
      - 总时间:163772.26 毫秒

      SQLite3

      运行时间:真实 0.001 用户 0.000790 系统 0.000165

      【讨论】:

        猜你喜欢
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-11
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多