我有大约 50000 个 XML 文件,每个文件大小为 50KB。我想在这些文件中搜索数据,但到目前为止我的解决方案非常慢。有什么方法可以提高搜索性能?
6 回答
您可以使用Lucene.NET,这是一个轻量级、快速、平面文件搜索索引引擎。
有关入门教程,请参阅http://codeclimber.net.nz/archive/2009/09/02/lucene.net-your-first-application.aspx 。
您始终可以将文件内容索引到数据库并在那里执行搜索。数据库在搜索方面非常高效。
我假设您使用的是 Windows,并且您可以使用 Windows 桌面搜索来快速搜索文件。您将使用 Windows 索引,该索引会在文件更改时更新。SDK 可在此处获得,可从 .NET 使用
You could spin up a Splunk instance and have it index your files. It's billed mostly as a log parser but would still serve your needs. It tokenizes files into words, indexes those words, and provides both a web-based and a CLI-based search tool that supports complex search criteria.
很大程度上取决于这些 XML 文件的性质。它们只是 50,000 个不会重新生成的 XML 文件吗?还是它们在不断变化?XML 文件中是否只有某些元素要索引以进行搜索?
当然,打开 50k 文件句柄、读取其内容和搜索文本会非常慢。我同意 Pavel 的观点,将数据放入数据库会产生很大的性能,但如果您的 XML 文件经常更改,则必须有一些方法使它们与数据库保持同步。
如果您想推出自己的解决方案,我建议您扫描所有文件并创建一个单词索引。如果您的文件经常更改,您还需要跟踪您的“最后修改”日期,如果文件更改时间比该日期更晚,请更新您的索引。这样,您将拥有一个巨大的单词索引,如果搜索“foo”,索引将显示该单词可以在文件 file39209.xml、file57209 和 file01009.xml 中找到。根据 XML 的性质,您甚至可以将元素存储在索引文件中(本质上,这就像将所有 XML 文件合并为一个)。
使用 XML 数据库。如果您想要开源,通常的建议是 eXist,如果您想要商业化的东西,则使用 MarkLogic,但如果 Microsoft 对您很重要并且您不想要最终的 XML 功能,您可以使用 SQL Server。如果你想评估它们,还有很多其他的。所有数据库产品都有一个陡峭的学习曲线,但对于这些数据量,它是正确的解决方案。