在XML文件中搜索

时间:2019-01-26 18:40:20

标签: javascript node.js xml

我有约25万个XML文件,每个文件都有一个UUID命名,我想对这些文件进行全文搜索,并标识出匹配文件的UUID。在nodejs环境中建立索引的最佳策略是什么?

我可以将文件导入某个数据库(例如SQLite),然后使用全文本搜索模块(对于SQLite,则为FTS5)。但是我不得不以某种方式忽略XML标记。

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

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

欢迎提出战略建议。

4 个答案:

答案 0 :(得分:1)

分三个步骤:

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

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

  3. 在处理之后,所有文件位置都在同一行中具有相同的UUID。

您可以签出我的npm:  XML解析器link

答案 1 :(得分:1)

根据您对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查询。

答案 2 :(得分:0)

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

(Oracle,SQL Server和DB2之类的关系数据库也提供XML附加组件,但是由于复杂性,我不会走这条路)。

答案 3 :(得分:0)

我决定使用SQLite3 / FTS5路由。我用xml2js解析XML文件并将其存储在SQLite中。我有一个带有全文索引的虚拟表,可以真正快速地搜索它。在Michael Kay's suggestion上,我尝试了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 sys 0.000165