2012-03-05 38 views
3

我有這個龐大的按字母順序排序的索引,我需要獲取特定術語的行。逐行讀取文件並檢查我是否得到正確的術語對我來說似乎並不高效,因此索引的大小(我們對英文wikipedia語料庫編制索引)。Java:在字母排序的文本文件中查找單詞的最佳方法

因此,我正在尋找一種方法來進行二分法搜索。我使用LineNumberReader來有效地獲取行數,但似乎沒有有效的解決方案從文件中獲取第n行。

我想知道如果直到我在第n行讀取行,檢查它是否是正確的術語,並根據二進制搜索算法採取行動(可能再次讀取行,因爲我需要一條線我已跳過)更有效率,然後只是逐行檢查術語?

任何其他建議也非常歡迎!

請注意,我需要獲取一組行,具體取決於要搜索的術語集。

+0

請注意,['LineNumberReader'](http://docs.oracle.com/javase/7/docs/api/java/io/LineNumberReader.html)不會聲稱有效地索引文件或獲取線。它只是在線性讀取文件時報告當前行號。 – 2012-03-05 01:42:19

+0

好的,謝謝你讓我知道。 – ljtijhuis 2012-03-05 09:37:40

回答

1

逐行讀取文件效率不高,是的,尤其是對於您正在使用的語料庫的大小。您是否考慮過將數據編入索引而不是平面文件?就像可以查詢的數據庫一樣?或者使用像Lucene這樣的工具來索引和搜索數據?

5

聽起來像你應該使用數據庫 - 他們受益於多年與大型數據集索引查詢有關的精心工程,如果你自己推出,你不可能來到任何附近。

如果你真的想這樣做你自己你需要創建兩個單獨的索引:

  • 字的索引 - >包含術語,因此您可以快速計算出一套行號(S)包含給定的搜索詞
  • 的行號索引行號 - >在文件中的位置,因此您可以快速檢索通過隨機訪問行權

此外,如果你的數據集是非常大,那麼這兩個索引coul d本身比內存大。所以你必須實現一個基於磁盤的索引 - 就像B-Tree。在這一點上,你將重塑大部分的RDBMS輪子,並可能首先讓自己無法使用合適的數據庫。

考慮嘗試PostgreSQL - 它是開源的,非常成熟,維護良好,並且具有相當不錯的文本搜索功能。

+0

感謝您的反饋,一定會考慮它! – ljtijhuis 2012-03-05 09:37:01

相關問題