8

コード スニペットを PostgreSQL/MySQL データベースまたはファイル システムに保存するツールを設計しているとします。これらのスニペットを検索したいと思います。Sphinx のような検索エンジンを使用することは、コードを検索するときにコードの正確なテキスト一致が必要なため、実用的ではないようです。

grepそしてack、常にうまく機能していますが、データベースにデータを保存すると、特定の方法でデータの大きなコレクションがより管理しやすくなります。grepディレクトリのツリーを再帰的に実行することの相対的なパフォーマンスは、SQL の LIKE や MySQL の REGEXP 関数のようなクエリを TEXT blob を持つ同等の数のレコードに対して実行することと比較してどうなるのでしょうか。

4

4 に答える 4

3

grepする100万個のファイルがある場合は、(私が知っている限りでは)正規表現を使用して各ファイルを調べます。

すべての目的と目的で、LIKE演算子または正規表現を使用してテーブルの行を一括クエリすると、テーブルの行に対して同じことを行うことになります。

私自身のgrepの経験では、完全な単語が1つも含まれていないものを探すことはめったにありません。そのため、データベースを利用して、検索するセットを減らすことができる場合があります。

MySQLにはネイティブの全文検索機能がありますが、InnoDBを使用していないことを意味するため、使用しないことをお勧めします。

あなたはここでPostgresからそれらについて読むことができます:

http://www.postgresql.org/docs/current/static/textsearch.html

tsvector列にインデックスを作成した後、2つのステップで「grep」を実行できます。1つは漠然と修飾される可能性のある行をすぐに検索し、次に真の基準で別の行を検索します。

select * from docs where tsvcol @@ :tsquery and (regexp at will);

これは、grepが実行できるものよりも大幅に高速になります。

于 2011-05-08T17:58:48.243 に答える
1

それらを比較することはできませんが、どちらも時間がかかります。私の推測では、grep の方が高速になります。

しかし、MySQL は全文のインデックス作成と検索をサポートしており、grep よりも高速です。

また、Sphinx や Lucene の何が問題なのかわかりませんでした。とにかく、これは MySQL、Sphinx、Lucene のベンチマークです。

于 2011-05-08T11:59:47.167 に答える
0

インターネットは、ボイヤームーア文字を使用していると推測しているようですgrep。これにより、クエリ時間はクエリサイズに追加的に(乗法的にではなく)依存します。ただし、これはそれほど重要ではありません。

1回限りの検索にはほぼ最適だと思います。しかし、あなたの場合、bpgergoが示唆しているように、検索を繰り返したので、(たとえば、クエリ内の特定の一般的なサブ文字列にインデックスを付けることによって)の構造を利用できるため、より良い結果が得られます。

また、使用しようとしている正規表現エンジンが非特殊クエリ用に最適化されているかどうかもわかりません。試してみてください。

ハードディスクベースの速度低下を回避するために、検索しているすべてのファイルをメモリに保持することをお勧めします。驚異的な量のテキストを検索しない限り、これは機能するはずです。

于 2011-05-08T12:22:47.430 に答える
0

コードの全文索引が必要な場合は、Russ Cox のコード検索ツール https://code.google.com/p/codesearch/をお勧めします

これはGoogleコード検索の仕組みです http://swtch.com/~rsc/regexp/regexp4.html

于 2013-02-06T20:03:56.713 に答える