3

アルファベット順に並べ替えられたこの巨大なインデックスがあり、特定の用語の行を取得する必要があります。ファイルを 1 行ずつ読んで正しい用語が得られたかどうかを確認するのは効率的ではないように思えます。そのため、インデックスのサイズが大きくなります (英語のウィキペディア コーパスにインデックスを付けました)。

そのため、行でバイナリ検索を行う方法を探しています。LineNumberReader を使用して行数を効率的に取得していますが、ファイルから n 番目の行を取得する効率的な解決策はないようです。

n 番目の行になるまで行を読み、それが正しい用語であるかどうかを確認し、バイナリ検索アルゴリズムに従ってアクションを実行する (おそらくスキップした行が必要なため、行を再度読み取る) 方が効率的かどうか疑問に思っています。次に、用語を1行ずつチェックするだけですか?

その他の提案も大歓迎です!

検索する用語のセットに応じて、一連の行を取得する必要があることに注意してください。

4

2 に答える 2

5

データベースを使用する必要があるように思えます。データベースは、大規模なデータセットに対するインデックス付きクエリに関連する長年の慎重なエンジニアリングの恩恵を受けています。

本当にこれを自分でやりたい場合は、2 つの別個のインデックスを作成する必要があります。

  • 単語のインデックス -> 用語を含む行番号。これにより、特定の検索用語を含む一連の行番号をすばやく計算できます。
  • 行番号のインデックス -> ファイル内の位置。ランダム アクセスで正しい行をすばやく取得できます。

さらに、データセットが非常に大きい場合、これらのインデックスの両方がメモリよりも大きくなる可能性がありますしたがって、 B-Treeのようなディスク ベースのインデックスを実装する必要があります。その時点で、RDBMS ホイールのほとんどを再発明することになり、そもそも適切なデータベースを使用しなかったことで自分自身を蹴飛ばすことになるでしょう。

PostgreSQLを試すことを検討してください。これはオープン ソースであり、非常に成熟しており、よく管理されており、かなりまともなテキスト検索機能を備えています。

于 2012-03-05T01:33:09.513 に答える
1

ファイルを 1 行ずつ読み取るのは非効率的です。特に、使用しているコーパスのサイズではそうです。フラットファイル以外のデータをインデックス化することを検討しましたか? クエリ可能なデータベースのようなものですか? または、Lucene のようなツールを使用してデータのインデックス作成と検索を行いますか?

于 2012-03-05T01:31:34.513 に答える