用Python进行XML数据的全文搜索:最佳实践、优缺点

13 投票
6 回答
3013 浏览
提问于 2025-04-16 16:26

任务

我想用Python来对XML数据进行全文搜索。

示例数据

<elements>
  <elem id="1">some element</elem>
  <elem id="2">some other element</elem>
  <elem id="3">some element
    <nested id="1">
    other nested element
    </nested>
  </elem>
</elements>

基本功能

我想要的最基本功能是,当我在XPath("/elements/elem")中搜索“other”时,至少能返回匹配元素(elem 2)和嵌套元素(elem 3,nested 1)的ID属性值,或者返回匹配的XPath。

理想功能

这个解决方案应该灵活且可扩展。我希望能有以下这些功能的组合:

  • 搜索嵌套元素(深度无限)
  • 搜索属性
  • 搜索句子和段落
  • 使用通配符进行搜索
  • 使用模糊匹配进行搜索
  • 返回精确的匹配信息
  • 在处理大型XML文件时有良好的搜索速度

问题

我并不指望能找到一个具备所有理想功能的解决方案,我需要将不同的现有功能结合起来,并自己编写其余部分。但首先,我想了解一下目前有哪些可用的库和方法,通常使用它们的优缺点是什么。

编辑:感谢大家到目前为止的回答,我添加了一些细节并开始了悬赏

6 个回答

2

我觉得你最好使用一个像Solr这样的全文搜索引擎:http://lucene.apache.org/solr/

你可以为每个<elem />在你的xml中存储一个“文档”到Solr里。你可以在这个文档中存储你想要的任何数据。然后,你可以在索引中搜索,并获取匹配文档中存储的id字段。这对于处理大量文档来说会非常快。

6

我不确定这是否能满足你的需求,但lxml支持在xpath中使用正则表达式(这意味着你可以使用xpath 1.0加上EXSLT扩展函数来处理正则表达式

与后面添加的功能列表相比:

  • 可以搜索嵌套元素(无限深度):可以
  • 可以搜索属性:可以
  • 可以搜索句子和段落:不可以。如果“段落”是实际的xml元素,那可以。但“句子”本身是不可以的。
  • 可以使用通配符搜索:可以(正则表达式)
  • 可以使用模糊匹配搜索:不可以(假设涉及词干提取、同义词等等...)
  • 可以返回精确的匹配信息:可以
  • 对于大型XML文件,搜索速度不错:可以,除非你的文件大到需要使用全文索引才能获得好的速度。

我认为满足你所有请求的唯一方法是将你的文件加载到一个支持“真正”全文搜索的本地xml数据库中(可能通过XQuery Fulltext),然后使用它。(对此我帮不了你太多,或许可以看看Sedna,它似乎有python API,并且支持全文搜索?)

撰写回答