用Python进行XML数据的全文搜索:最佳实践、优缺点
任务
我想用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 个回答
1
select="/elements/elem//[contains(.,'other')]"
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,并且支持全文搜索?)