Java:在字母排序的文本文件中查找单词的最佳方法

时间:2012-03-05 01:25:49

标签: java text-files binary-search alphabetical

我有这个按字母顺序排列的巨大索引,我需要获取特定术语的行。逐行读取文件并检查我是否得到正确的术语对我来说似乎没有效率,因此索引的大小(我们将英语维基百科语料库编入索引)。

因此我正在寻找一种在线上进行二分搜索的方法。我使用LineNumberReader来有效地获取行数,但似乎没有有效的解决方案来从文件中获取第n行。

我想知道是否读取行直到我在第n行,检查它是否是正确的术语并根据二进制搜索算法采取行动(可能再次读取行,因为我需要一行我已经跳过)比一行一行检查条款更有效率吗?

也非常欢迎任何其他建议!

请注意,我需要获取一组行,具体取决于要搜索的术语集。

2 个答案:

答案 0 :(得分:5)

听起来你应该使用一个数据库 - 它们受益于多年来与大型数据集上的索引查询相关的精心设计,如果你自己推出这些数据集,你就不太可能接近它。

如果你真的想自己做,你需要创建两个单独的索引:

  • 单词索引 - >包含该术语的行号,以便您可以快速计算包含给定搜索词的行号集
  • 行号索引 - >在文件中的位置,以便您可以通过随机访问快速检索正确的行

此外,如果您的数据集非常大,那么这两个索引本身都可能比内存更大。因此,您必须实现基于磁盘的索引 - 类似于B-Tree。在这一点上,你将重新发明大部分的RDBMS轮,并且可能会因为没有使用正确的数据库而踢自己。

考虑尝试PostgreSQL - 它是开源的,非常成熟且维护良好,并具有相当不错的文本搜索功能。

答案 1 :(得分:1)

逐行读取文件效率不高,是的,特别是使用您正在使用的语料库的大小。您是否考虑过将数据编入平面文件之外的其他内容?就像可以查询的数据库一样?或者使用像Lucene这样的工具来索引和搜索数据?