4

これは面接の質問です。

指定されたすべてのキーワードを含むすべてのファイルを検索するプログラムを作成する必要があります。検索パフォーマンスを向上させるために、ファイルをどのように前処理しますか。

私の答え:

私はLucene(または他のテキスト検索エンジン)を使用します。手動で実装する必要がある場合は、ドキュメントの単語をドキュメントIDにマップするインデックスを作成します。おそらく、そのインデックスを。で実装する必要がありB-treesます。別の方法は、RDBMS(mySQLまたはsmth。)を使用することですが、私にはやり過ぎのように見えます。

それは意味がありますか?この質問にどのように答えますか?

4

1 に答える 1

2

私は同意します、ほとんどの場合、テキスト検索エンジンは行く方法です..本当に構築が簡単で信頼性があります。ここでのほんの少しの詳細:ほとんどのエンジンはデフォルトでOR検索を行うため、すべての単語に一致させることを指定する必要があります。

独自のソリューションを構築する必要がある場合は、もちろん、マッピングを構築する必要があります。ツリーインデックスではなくハッシュルックアップを使用しますが、ツリーが大きくなりすぎないため、パフォーマンスがわずかに向上するだけです。それでも、ツリーを使用する意味はわかりません。ツリーのトラバーサル機能は必要ありません。前または次の単語を検索することはありません。

データ構造をどのように使用するかを実際に確認すると、さらに興味深い詳細がポップアップ表示されます。検索の例を見てみましょう:The pony he comes。直感的には、ルックアップをで開始することはありませんthe。おそらく、すべてのドキュメントにルックアップが含まれています(英語のテキストであると想定しています)。ponyは良い選択であり、検索を簡単に絞り込むことができます。ほとんどのテキスト検索エンジンには、このためのメトリックが含まれています。つまり、その特定の単語を含むドキュメントの数です。したがって、それに基づいて、頻度の最も低いものから始めて、頻度の高い順に単語を確認します。

検索を絞り込むことができたら、インデックスがうまく機能していないことに気付き始めます...まだtheチェックする単語があり、インデックスには無数のドキュメントが表示されるので、この時点でより良いでしょうドキュメントから単語への逆マッピングを使用する(ここでも、ハッシュルックアップまたはトライ)。一握りのドキュメントをチェックして、残りの単語が含まれているかどうかを確認します。

注:ここでの多くの決定(マッピングの保存方法、単純または二重マッピング、btree / hash / trie / ...)は、プロジェクトの規模によって異なります。明らかに、いくつかのファイルを検索する必要がある場合は単純なものを構築し、githubですべてのファイルにインデックスを付ける必要がある場合、またはインデックスでさえメモリに収まらない可能性がある遺伝子配列検索のために、異なるものを構築します...

于 2013-03-03T14:02:13.293 に答える