Googleを始めとした検索システムにおいて、検索ワードのテキストボックスにキーワードを入力すると候補文字列が表示されます。
これを「サジェスト」と呼び、日本語訳では「予測変換」になります。
このサジェスト文字列は、各サービスからAPIで提供されており、個別で実行可能になります。
今回は、各サービス毎のサジェストAPIの実行方法と、取得結果について紹介していきます。
環境情報
PHPでAPIを実行して、取得結果の表示をおこないます。
- PHP 5.5.35
APIのURL
各APIのURLは以下になります。
取得形式はXMLだったらJSONだったりするのですが、できるだけ様々なパターンを試してみたいので、両方のパターンを実施してみます。
サービス | 取得形式 | URL |
XML | http://www.google.com/complete/search?hl=en&output=toolbar&q=keyword | |
Yahoo | XML | http://ff.search.yahoo.com/gossip?output=xml&command=keyword |
Bing | JSON | https://api.bing.com/osjson.aspx?market=ja-JP&query=keyword |
Youtube | JSON | http://clients1.google.com/complete/search?hl=en&ds=yt&client=firefox&q=keyword |
Amazon | JSON | http://completion.amazon.co.jp/search/complete?search-alias=aps&mkt=6&q=keyword |
wikipedia | JSON | https://ja.wikipedia.org/w/api.php?action=opensearch&format=json&search=keyword |
※「keyword」が、予測変換したい文字列になります。
各APIのパラメータ詳細については、各サービスの正式ドキュメントを参照ください。
実行プログラムと実行結果
実行プログラムと実行結果を紹介していきます。
サービスによっては、APIの返り値には予測変換以外の属性情報が格納されている様なのですが、今回はあくまで予測変換文字列のみを抽出します。
なので、各プログラムで予測変換文字列以外は除外しています。
一番メジャーな(気がする)Googleのサンプルコードです。
XMLで結果を取得して表示するプログラムになります。
try { $searchWord = "wordPress"; $url = "http://www.google.com/complete/search?hl=en&output=toolbar&q=" . $searchWord; $result = simplexml_load_file($url); if (!isset($result)) { echo "not result."; exit; } foreach ($result->CompleteSuggestion as $item) { echo "suggestWord=" . $item->suggestion->attributes()->data . "
"; } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }
実行結果
suggestWord=wordpress suggestWord=wordpress login suggestWord=wordpress download suggestWord=wordpress themes suggestWord=wordpress tutorial suggestWord=wordpress plugin suggestWord=wordpress hosting suggestWord=wordpress php suggestWord=wordpress api suggestWord=wordpress free
Yahoo
YahooもGoogleと同じようにXMLでの結果取得が可能です。
XMLの構造がYahooとは異なるので、微妙にコーディングが異なります。
try { $searchWord = "wordPress"; $url = "http://ff.search.yahoo.com/gossip?output=xml&command=" . $searchWord; $result = simplexml_load_file($url); if (!isset($result)) { echo "not result."; exit; } foreach ($result as $item) { echo "suggestWord=" . $item->attributes()->k . "
"; } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }
実行結果
suggestWord=wordpress.com suggestWord=wordpress login suggestWord=wordpress.org suggestWord=wordpress.com login suggestWord=wordpress download suggestWord=wordpress themes suggestWord=www.wordpress.com login suggestWord=wordpress login wp-admin suggestWord=wordpress.org download suggestWord=wordpress templates
Bing
BingからJSON形式で取得します。
XMLとはプログラムは異なりますが、基本的な構造は変わりません。
また、取得結果の配列は2段階になっているので、結果の配列構造も意識したプログラムとなります。
try { $searchWord = "wordPress"; $url = "https://api.bing.com/osjson.aspx?market=ja-JP&query=" . $searchWord; $result = file_get_contents($url); if (!isset($result)) { echo "not result."; exit; } $result = json_decode($result, true); for ($lc = 0; $lc < count($result); $lc++) { if (is_array($result[$lc])) { $searchWord = $result[$lc]; for ($slc = 0; $slc < count($searchWord); $slc++) { echo "suggestWord=" . $searchWord[$slc] . "
"; } } } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }
実行結果
suggestWord=wordpress suggestWord=wordpress ログイン suggestWord=wordpress 使い方 suggestWord=wordpressとは suggestWord=wordpress インストール suggestWord=wordpress テーマ suggestWord=wordpress ログインできない suggestWord=wordpress テンプレート suggestWord=wordpress log in
Youtube
YoutubeはBingと同じプログラムで結果を取得できます。
APIのURLが違うだけです。
結果は以下になります。
実行結果
suggestWord=wordpress suggestWord=wordpress tutorial suggestWord=wordpress 使い方 suggestWord=wordpress website suggestWord=wordpress blog suggestWord=wordpress theme suggestWord=wordpress speed optimization suggestWord=wordpress plugins suggestWord=wordpress マナブ suggestWord=wordpress php
Amazon
Amazonは、BingとYoutubeと基本的に同様なのですが、結果配列の3階層目にも情報が格納されているようです。
サジェストワードは2階層目なので、3階層目を除外する制御を入れています。
try { $searchWord = "wordPress"; $url = "http://completion.amazon.co.jp/search/complete?search-alias=aps&mkt=6&q=" . $searchWord; $result = file_get_contents($url); if (!isset($result)) { echo "not result."; exit; } $result = json_decode($result, true); for ($lc = 0; $lc < count($result); $lc++) { if (is_array($result[$lc])) { $searchWord = $result[$lc]; for ($slc = 0; $slc < count($searchWord); $slc++) { if (is_array($searchWord[$slc])) { continue; } echo "suggestWord=" . $searchWord[$slc] . "
"; } } } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }
実行結果
suggestWord=wordpressの教科書 suggestWord=wordpress suggestWord=wordpress 本 suggestWord=wordpress php suggestWord=wordpress ブログ suggestWord=wordpress カスタマイズ suggestWord=wordpressデザインレシピ集 suggestWord=wordpress 仕事の現場でサッと使える デザイン教科書 suggestWord=wordpress デザイン suggestWord=wordpress レッスンブック
wikipedia
wikipediaは、他サービスとちょっと異なります。
実行プログラムは他のJSON形式と同一なのですが、結果にURLが格納されています。
※親切ですね
以下のサンプルプログラムでは、他結果との違いが分かりやすいように、キーワードを「wordPress」ではなく「japan」(結果がたくさん返ってくる)にしています。
また、空欄の結果文字列は除外しています。
try { $searchWord = "japan"; $url = "https://ja.wikipedia.org/w/api.php?action=opensearch&format=json&search=" . $searchWord; $result = file_get_contents($url); if (!isset($result)) { echo "not result."; exit; } $result = json_decode($result, true); for ($lc = 0; $lc < count($result); $lc++) { if (is_array($result[$lc])) { $searchWord = $result[$lc]; for ($slc = 0; $slc < count($searchWord); $slc++) { if (is_array($searchWord[$slc])) { continue; } if (strlen($searchWord[$slc]) == 0) { continue; } echo "suggestWord=" . $searchWord[$slc] . "
"; } } } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }
実行結果
suggestWord=Japan suggestWord=JAPAN COUNTDOWN suggestWord=JAPAN FM LEAGUE suggestWord=Japan Expo suggestWord=JAPAN (アルバム) suggestWord=JAPANサッカーカレッジ suggestWord=JAPAN JAM suggestWord=JAPANNEXT suggestWord=JAPANARIZM suggestWord=Japan Skeptics suggestWord=https://ja.wikipedia.org/wiki/Japan suggestWord=https://ja.wikipedia.org/wiki/JAPAN_COUNTDOWN suggestWord=https://ja.wikipedia.org/wiki/JAPAN_FM_LEAGUE suggestWord=https://ja.wikipedia.org/wiki/Japan_Expo suggestWord=https://ja.wikipedia.org/wiki/JAPAN_(%E3%82%A2%E3%83%AB%E3%83%90%E3%83%A0) suggestWord=https://ja.wikipedia.org/wiki/JAPAN%E3%82%B5%E3%83%83%E3%82%AB%E3%83%BC%E3%82%AB%E3%83%AC%E3%83%83%E3%82%B8 suggestWord=https://ja.wikipedia.org/wiki/JAPAN_JAM suggestWord=https://ja.wikipedia.org/wiki/JAPANNEXT suggestWord=https://ja.wikipedia.org/wiki/JAPANARIZM suggestWord=https://ja.wikipedia.org/wiki/Japan_Skeptics