読者です 読者をやめる 読者になる 読者になる

月曜日までに考えておきます

ITネタとゲームネタ中心に興味のあること色々書きます。

Googleカスタム検索でディレクトリごとに検索対象を絞り込む

仕事でやっているサービスにGoogleカスタム検索(カスタム検索エンジン)を入れようとして、以下の問題にぶち当たって解決したのでそのメモ。

ディレクトリごとに検索対象を分けたい

コンテンツごとにディレクトリを分けていて、そのディレクトリのトップにカスタム検索を設置する場合、別のディレクトリ内のコンテンツはヒットさせたくなかった。

例えば掲示板のようなサービスで、「Splatoon」と「だがしかし」について以下のようにパスを切っていたとする。

  • https://www.example.com/forums/splatoon
  • https://www.example.com/forums/dagashikashi

これらのそれぞれのトップにカスタム検索エンジンを設置した場合に、"ほたる/ホタル"で検索した場合、どちらのコンテンツもヒットしてしまう、という問題を解消したかった。

カスタム検索自体にディレクトリを入れる例

カスタム検索の対象とするURLにディレクトリまで含めることができるので、

  • https://www.example.com/forums/splatoon
  • https://www.example.com/forums/dagashikashi

のそれぞれをカスタム検索エンジンに登録してそれぞれIDを取れば実現可能。

しかし、この対象とするコンテンツがこの2個ならいいが、増加していく場合や50個、100個とある場合、すべて登録するのは現実的ではないので断念。

ドキュメント読む

Custom Search Element Control API  |  Custom Search  |  Google Developers

webSearchQueryAddition という項目があるので、

<gcse:search webSearchQueryAddition="splatoon"></gcse:search>

のようなことをやると、検索内容が自動的に"splatoon"とのand検索になるので、「Splatoon」のホタルの話しかヒットしなくなる。

ただし、「だがしかし」側に「だがしかしのほたるさんもSplatoonのホタルちゃんもかわいい!」のような書き込みがあるとSplatoon側からヒットするので本質的な解決策ではない。

本質的な解決策

上記ドキュメントのparameterの1つに、as_sitesearchというのがある。 これがホストだけではなくパスも含めて指定できる。

今回の例の場合、https://www.example.com/forums/splatoon のページに設置するカスタム検索タグは、

<gcse:search as_sitesearch="https://www.example.com/forums/splatoon"></gcse:search>

https://www.example.com/forums/dagashikashi のページに設置するカスタム検索タグは

<gcse:search as_sitesearch="https://www.example.com/forums/dagashikashi"></gcse:search>

のようにする。

こうすることでカスタム検索自体のIDは1つしか発行せずに、適切に検索対象となるコンテンツを分けられることがわかった。