• ベストアンサー

mysqlでyahooやgoogleのような検索スピードを出したい

mysqlでyahooやgoogleのような検索スピードを出したい yahooやgoogleで検索するとどんなキーワードを入れても1秒以内に結果が返ってきます。 mysqlでデータ1000万件程度を想定してるのですが、いくらネットで調べて最適化したインデックスを貼っても全文検索にしてもyahooやgoogleのようにはいきません。 これは主にハード構成が主因となってるのでしょうか? サーバーを並列化するとかってのをネットで見ることもあるのですが具体的にどうなってるから速いのかよくわかりません。 そのあたりのご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#140045
noname#140045
回答No.1

まず、結論から言えばそれは企業秘密であり、それこそが検索サイトの一番の難しいところです。 以前は、いろいろな検索サイトが存在しましたが、今では検索エンジンはほとんどyahooかgoogleになっています。 つまり、それほど特殊な技術を要するものだと言うことです。 一方、SQL言語は多少の違いはあっても、一応規格があるためそれから逸脱することはありません。 たとえば「mysqlでyahooやgoogleのような検索スピードを出したい 」をgoogleで検索するといろいろと出てきますが、それをSQL言語で記述した場合には「%mysqlでyahooやgoogleのような検索スピードを出したい%」となり、たぶん1件しかマッチしないでしょう。 つまり、同じ結果を求めるなら日本語を解析する必要があります。 Twitterでまだ日本語での検索ができないのも、これが原因です。 また、これだけでなく長い文章の中から特定の文字を検索する場合もSQLでは先頭から検索するだけですが(つまり目視と同じ考え)このような検索サイトではキーワードを抽出し、インデックスを作成するなど特殊な技術が用いられています。 SQLでもキーワードを抽出してインデックス化すれば、できないことはないと思いますが、infoseekやexsiteが撤退(googleの検索エンジンを使用)したように並大抵の努力では実現できないと思います。 (細かな点で間違いがあるかも知れませんので、その点はご了承ください)

mijatovic_08
質問者

お礼

回答ありがとうございます。 >結論から言えばそれは企業秘密であり、それこそが検索サイトの一番の難しいところです。 やはりネット上でいくら調べても出てこないですよね。 >これだけでなく長い文章の中から特定の文字を検索する場合もSQLでは先頭から検索するだけですが(つまり目視と同じ考え)このような検索サイトではキーワードを抽出し、インデックスを作成するなど特殊な技術が用いられています。 SQLだけでなんとかしようというのが無理ってことでしょうか。 なかなか難しいですがもう少し調べてみます。

その他の回答 (1)

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.2

検索を早くするにはsonotさんの回答のようにインデックスを作成する方法がよくとられます。「インデックス」といってもSQLのインデックスのことではなく、検索キーワードのインデックスで、早い話が、日本語(+英語&more?)のすべて つまり辞書にある全単語別にあらかじめ結果を出しておくことになります。 検索結果を記した自分のサイト専用の広辞苑をイメージすればよいでしょう。 Namazu が有名で官公庁の書類検索でもよく見かけますが、他にも日本語解析用のモジュールやら辞書やらが必要で、indexの生成にも結構な時間がかかりますので、頻繁に更新されるデータには向いていないかと。  何より通常のテキストファイルではなくSQLとかませるとすればそれなりの処理が必要でしょう。 簡単な対処方として、まずインデックス(Mysqlの)を外して比較してみてはいかがですか? どのようなデータ構造かはわかりませんが、インデックスは使用方法をあやまると負担が増えて遅くなるだけです。(ほとんどの場合キーワード検索ではじゃまなだけ) WHERE フィールド LIKE '%キワード%';  としていません? また、検索対象フィールドをconcatで相当数連結しているのなら、あらかじめ連結したフィールドを作成し、それに対して検索をかけるなど。 無駄に容量を食いますが早くはなります。 その他、簡単に出来る方法としては、キャッシュを生成しておけば閲覧者も SQLもすこし幸せになれるかもしれません。

mijatovic_08
質問者

お礼

回答ありがとうございます。 >Namazu が有名で官公庁の書類検索でもよく見かけますが、他にも日本語解析用のモジュールやら辞書やらが必要で、indexの生成にも結構な時間がかかりますので、頻繁に更新されるデータには向いていないかと。 なるほど、そういうやり方もあるのですね。勉強になります。