我有这个按字母顺序排列的巨大索引,我需要获取特定术语的行。逐行读取文件并检查我是否得到正确的术语对我来说似乎没有效率,因此索引的大小(我们将英语维基百科语料库编入索引)。
因此我正在寻找一种在线上进行二分搜索的方法。我使用LineNumberReader来有效地获取行数,但似乎没有有效的解决方案来从文件中获取第n行。
我想知道是否读取行直到我在第n行,检查它是否是正确的术语并根据二进制搜索算法采取行动(可能再次读取行,因为我需要一行我已经跳过)比一行一行检查条款更有效率吗?
也非常欢迎任何其他建议!
请注意,我需要获取一组行,具体取决于要搜索的术语集。
答案 0 :(得分:5)
听起来你应该使用一个数据库 - 它们受益于多年来与大型数据集上的索引查询相关的精心设计,如果你自己推出这些数据集,你就不太可能接近它。
如果你真的想自己做,你需要创建两个单独的索引:
此外,如果您的数据集非常大,那么这两个索引本身都可能比内存更大。因此,您必须实现基于磁盘的索引 - 类似于B-Tree。在这一点上,你将重新发明大部分的RDBMS轮,并且可能会因为没有使用正确的数据库而踢自己。
考虑尝试PostgreSQL - 它是开源的,非常成熟且维护良好,并具有相当不错的文本搜索功能。
答案 1 :(得分:1)
逐行读取文件效率不高,是的,特别是使用您正在使用的语料库的大小。您是否考虑过将数据编入平面文件之外的其他内容?就像可以查询的数据库一样?或者使用像Lucene这样的工具来索引和搜索数据?