JavaでGoogle Custom Searchを活用する方法

# はじめに

Google Custom Searchは、特定のウェブサイトや複数のウェブサイト、あるいはインターネット全体からカスタマイズされた検索結果を取得するための強力なツールです。この記事では、Javaを使用してGoogle Custom Search APIにアクセスし、検索結果を取得する基本的な方法を説明します。

# 必要な準備

- Google Cloud Platformアカウント
- Google Custom Search Engineの設定
- APIキーと検索エンジンID

# 主なステップ

1. **リソースバンドルの作成**:
   - `config.properties`ファイルに`google.apikey`と`google.custom.search.engine.id`を設定します。これにより、APIキーや検索エンジンIDなどの設定情報をプログラムから簡単に読み込むことができます。

2. **GoogleSearchServiceクラスの実装**:
   - Javaで`GoogleSearchService`クラスを作成し、Google Custom Search APIへのリクエストを処理します。このクラスは`AbsBaseService`クラスを拡張し、検索クエリに基づいて検索結果を返す`search`メソッドを提供します。

3. **依存関係の管理**:
   - MavenやGradleなどのビルドツールを使用して、Google APIクライアントライブラリなどの必要な依存関係を管理します。

```xml:pom.xml
<dependencies>
    <!-- Google API Client Gson Library -->
    <dependency>
        <groupId>com.google.api-client</groupId>
        <artifactId>google-api-client-gson</artifactId>
        <version>2.2.0</version>
    </dependency>
    <!-- Google Custom Search API -->
    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-customsearch</artifactId>
        <version>v1-rev20230702-2.0.0</version>
    </dependency>
</dependencies>
```


# コードのポイント

- **セキュリティ**: APIキーは機密情報です。外部設定ファイルや環境変数で安全に管理し、ソースコードリポジトリには含めないようにしましょう。
- **例外処理**: `IOException`や`GeneralSecurityException`など、適切な例外処理を実装し、予期しないエラーに対処します。
- **API利用の制限とコスト**: APIの利用状況をモニタリングし、料金が発生する可能性に注意してください。

# 実装例

```java:GoogleSearchService.java
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.List;
import java.util.ResourceBundle;

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.customsearch.v1.CustomSearchAPI;
import com.google.api.services.customsearch.v1.CustomSearchAPIRequestInitializer;
import com.google.api.services.customsearch.v1.model.Result;

public class GoogleSearchService {

    // シングルトンインスタンス
    private static GoogleSearchService instance = new GoogleSearchService();

    // アプリケーション名
    private static final String APPLICATION_NAME = "APPLICATION_NAME";

    // JSONを処理するためのファクトリ
    private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();

    // APIキーやその他の設定を管理するリソースバンドル
    private final ResourceBundle config = ResourceBundle.getBundle("config");

    /**
     * シングルトンパターンによるインスタンス取得メソッド。
     * @return GoogleSearchServiceのシングルトンインスタンス
     */
    public static GoogleSearchService getInstance() {
        return GoogleSearchService.instance;
    }

    /**
     * 提供されたクエリを使用してWeb検索を行い、検索結果を返します。
     * @param query 検索クエリ文字列
     * @return 検索結果を表すResultオブジェクトのリスト
     * @throws IOException ネットワーク問題が発生した場合
     * @throws GeneralSecurityException Googleクライアントのセキュリティ問題が発生した場合
     */
    public List<Result> search(final String query) throws IOException, GeneralSecurityException {

        // Google APIと通信するためのHTTPトランスポートを初期化
        final var httpTransport = GoogleNetHttpTransport.newTrustedTransport();

        // configからAPIキーとカスタム検索エンジンIDを取得
        final var apiKey = this.config.getString("google.apikey");
        final var searchEngineId = this.config.getString("google.custom.search.engine.id");

        // 必要な設定でCustom Search APIを初期化
        final var cs = new CustomSearchAPI.Builder(httpTransport, GoogleSearchService.JSON_FACTORY, null)
                .setApplicationName(GoogleSearchService.APPLICATION_NAME)
                .setGoogleClientRequestInitializer(new CustomSearchAPIRequestInitializer(apiKey))
                .build();

        // 検索クエリを準備して実行
        final var list = cs.cse().list(query).setCx(searchEngineId).setGl("jp").setQ(query);
        final var result = list.execute();
        final var items = result.getItems();

        // 検索結果を返す
        return items;
    }
}
```

# まとめ

Javaを使用してGoogle Custom Search APIを活用する方法を学びました。これにより、検索結果をカスタマイズして、さまざまなアプリケーションやサービスに組み込むことが可能になります。この基本をマスターしたら、さらに高度な機能や、他のGoogle APIとの統合に挑戦してみてください。

# 参考ページ

- [Google Custom SearchとJavaを使った検索アプリケーションの作り方](https://qiita.com/oyahiroki/items/44b3c95a7bbc90e816fc)
- [JavaからGoogle Custom Searchを使う方法](https://qiita.com/zak_y/items/42ca0f1ea14f7046108c)