仕事でやっているサービスに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つしか発行せずに、適切に検索対象となるコンテンツを分けられることがわかった。