3

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

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

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

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

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

4

2 回答 2

5

听起来您应该使用数据库——它们受益于多年来与大型数据集上的索引查询相关的精心设计,如果您自己动手,您不太可能接近。

如果您真的想自己执行此操作,则需要创建两个单独的索引:

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

此外,如果您的数据集真的很大,那么这两个索引本身都可能大于 memory。所以你必须实现一个基于磁盘的索引——比如B-Tree。到那时,您将重新发明大多数 RDBMS 轮子,并且可能会因为一开始就没有使用正确的数据库而自责。

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

于 2012-03-05T01:33:09.513 回答
1

是的,逐行读取文件效率低下,尤其是在您使用的语料库大小的情况下。您是否考虑过在非平面文件中索引数据?像一个可以查询的数据库?或者使用像 Lucene 这样的工具来索引和搜索数据?

于 2012-03-05T01:31:34.513 回答