OCI Search Service for OpenSearch を使って検索アプリケーションを作成する

Oracle Cloud Infrastructure Search Service with OpenSearch は、OpenSearch に基づいてアプリケーション内検索ソリューションを構築するために使用できるマネージド・サービスであり、インフラストラクチャの管理に集中することなく、大規模なデータセットを検索し、結果をミリ秒で返すことができます。

ハンズオンの流れは以下となります。

  1. OpenSearch クラスターのプロビジョニング
  2. クラスタへの接続
  3. データセットのアップロード
  4. アプリケーションの作成とデプロイメント
  5. アプリケーションのテスト

前提条件

ハンズオン環境のイメージ

architecture.png

1. OpenSearch クラスターのプロビジョニング

OpenSearch クラスタは、OpenSearch 機能を提供するコンピュート・インスタンスのセットです。各インスタンスはクラスタ内のノードです。ノードのタイプは、インスタンスによって実行される機能およびタスクを決定するものです。各クラスタは、1 つ以上のデータ・ノード、マスター・ノードおよび OpenSearch ダッシュボード・ノードで構成されます。

opensearch cluster

OCI コンソールを使ってクラスターを作成します

ナビゲーション・メニューを開きます。「データベース」をクリックします。OpenSearch で、「クラスタ」をクリックします。

open opensearch menu

OpenSearch 一覧画面で「クラスタの作成」ボタンをクリックします。

click_createcluster_button

クラスタの名前を指定し、クラスタを作成するコンパートメントを選択して、「」をクリックします。

config cluster

セキュリティの構成で、ユーザー名、パスワードを以下のように入力します。

  1. ユーザー名: guest
  2. パスワード: Welcome#123

cluster security config

ノード最適化オプションで「開発」オプションを選択します。「」をクリックします。

config node

ネットワーキングの構成」セクションで、既存の仮想クラウド・ネットワークを選択して、次の選択を行います。

  • 仮想クラウド・ネットワーク: 前提条件で作成したクラウド・ネットワーク。
  • サブネット: 「既存のサブネットを選択」を選択して、サブネットは前提条件で作成したインスタンスと同じパブリックサブネットを指定します。

    上記の選択をした後は、「」をクリックします。

config vnc and subnet

「サマリー」ページでクラスタ確認の詳細を確認し、「クラスタの作成」をクリックします。

submit creation request

2. クラスタへの接続

クラスタ接続情報を取得します

ナビゲーション・メニューを開きます。「データベース」をクリックします。OpenSearch で、「クラスタ」をクリックします。

open opensearch menu

クラスタ」リストで、詳細を表示するクラスタの名前をクリックします。

click cluster

クラスタの詳細」ページで、下記の情報を取得します。

  • API エンドポイント: クラスタのプライベート・エンドポイントの FQDN。
  • プライベート IP: クラスタのプライベート・エンドポイントのプライベート IP アドレス。
  • OpenSearch ダッシュボード API エンドポイント: クラスタの OpenSearch ダッシュボードの FQDN。
  • OpenSearch ダッシュボード・プライベート IP: クラスタの OpenSearch ダッシュボードへの接続に使用できるプライベート・エンドポイントの IP アドレス。

confirm cluster detail

セキュリティ・ルールを作成します

  1. ナビゲーション・メニューを開きます。「データベース」をクリックします。OpenSearch で、「クラスタ」をクリックします。
  2. 目的のクラスタをクリックします。
  3. クラスタの詳細」の「サブネット」で、サブネットの名前をクリックします。「サブネット詳細」ページが開きます。

click subnet

セキュリティ・リスト」で「デフォルト・セキュリティ・リスト」という名前のセキュリティ・リストをクリックします。

click security list

イングレス・ルールの追加」をクリックします。

add ingress rule

ルールの次の値を入力します:

  • ステートレス: このチェックボックスは選択を解除したままにします。
  • ソース・タイプ: CIDR
  • ソース CIDR: 0.0.0.0/0
  • IP プロトコル: TCP
  • ソース・ポート範囲: すべて
  • 宛先ポート範囲: 9200
  • 説明: ルールのオプションの説明。

add ingress rule

別のイングレス・ルール」をクリックします。

add ingress rule

ルールの次の値を入力します:

  • ステートレス: このチェックボックスは選択を解除したままにします。
  • ソース・タイプ: CIDR
  • ソース CIDR: 0.0.0.0/0
  • IP プロトコル: TCP
  • ソース・ポート範囲: すべて
  • 宛先ポート範囲: 5601
  • 説明: ルールのオプションの説明。

add ingress rule

別のイングレス・ルール」をクリックします。

add ingress rule

ルールの次の値を入力します:

  • ステートレス: このチェックボックスは選択を解除したままにします。
  • ソース・タイプ: CIDR
  • ソース CIDR: 0.0.0.0/0
  • IP プロトコル: TCP
  • ソース・ポート範囲: すべて
  • 宛先ポート範囲: 8080
  • 説明: ルールのオプションの説明。

add ingress rule

イングレス・ルールの追加」をクリックします。

add ingress rule

クラスタへの接続のテスト ローカル・マシンからVM インスタンスに接続したら、次のいずれかのコマンドを実行して接続をテストします。

curl -u guest:Wellcome#123 https://<cluster_API_endpoint>:9200

エンドポイントへの接続が成功すると、次のようなレスポンスが返されます:

{
  "name" : "opensearch-master-0",
  "cluster_name" : "<cluster_name>",
  "cluster_uuid" : "<cluster_UUID>",
  "version" : {
    "distribution" : "opensearch",
    "number" : "1.2.4-SNAPSHOT",
    "build_type" : "tar",
    "build_hash" : "<build_hash>",
    "build_date" : "2022-02-08T16:44:39.596468Z",
    "build_snapshot" : true,
    "lucene_version" : "8.10.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "The OpenSearch Project: https://opensearch.org/"
}

クラスタの OpenSearch ダッシュボードへの接続のテスト 01. ローカル・マシンから次のコマンドを実行します。

ssh -C -v -t -L 127.0.0.1:5601:<OpenSearch_Dashboards_private_IP>:5601 -L 127.0.0.1:9200:<OpenSearch_cluster_private_IP>:9200 opc@<VM_instance_public_IP> -i <private_key_file>

<OpenSearch_Dashboards_private_IP>を、クラスタの OpenSearch ダッシュボードのプライベート IP に置き換えます。<OpenSearch_cluster_private_IP>をクラスタのプライベート IP に置き換えます。 <VM_instance_public_IP>を VM インスタンスのパブリック IP アドレスに置き換えます。<private_key_file>を、インスタンスへの接続に使用する秘密キーへのパスに置き換えます。これらの値とその検索方法の詳細は、インスタンスへの接続を参照してください。

  • ローカル・マシンの Hosts ファイルに下記内容を追加します。

    127.0.0.1 <cluster_API_endpoint> <cluster_Dashboard_endpoint>
    
    • ローカル・マシンが Mac の場合、Hosts ファイルの位置は/etc/hostsです。Hosts ファイルを更新した後は、下記のコマンドを実行してローカル DNS を更新します。

      sudo killall -HUP mDNSResponder
      
    • ローカル・マシンが Windows の場合、Hosts ファイルの位置はC\Windows\System32\drivers\etc\hostsです。

  • ローカル・マシンのブラウザから、https://<cluster_Dashboard_endpoint>:5601を開いて OpenSearch ダッシュボードにアクセスします。

作成したユーザー名、パスワードを入力します。

open opensearch dashborad

open opensearch dashborad

3. データセットのアップロード

OpenSearch ダッシュボードを使ってデータセットをアップロードします。

ナビゲーション・メニューを開きます。Dev Tools をクリックします。

opensearch_dashborad

Dev Tools で accounts.json の内容を Console にペーストします。

実行ボタンをクリックします。

dataset_uploaded

Console に下記の DSL を実行して、データセットを検索してみます。

GET accounts/_search
{
  "query": {
    "match": {
      "firstname": "Amber"
    }
  }
}

query_result

4. アプリケーションの作成とデプロイメント

アプリケーションの作成

Helidon MPOpenSearch の Java high-level REST clientを使って上記データセットを検索するアプリケーションを作成します。

  • Helidon MP の使い方はこちらをご参照ください。
  • OpenSearch の Java high-level REST client の使い方はこちらをご参照ください。
// ...
@Path("/accounts")
@RequestScoped
public class AccountResource {
    private String openSearchEndpoint;
    private final CredentialsProvider credentialsProvider;

    @Inject
    public AccountResource(@ConfigProperty(name = "oci.opensearch.api.endpoint") String openSearchEndpoint,
            @ConfigProperty(name = "oci.opensearch.credential.username") String username,
            @ConfigProperty(name = "oci.opensearch.credential.password") String password) {
        this.openSearchEndpoint = openSearchEndpoint;
        credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(username, password));
    }

    @Path("/search/{inputTerm}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response search(@PathParam("inputTerm") String inputTerm) {
        // Create a client.
        RestClientBuilder builder = RestClient.builder(HttpHost.create(openSearchEndpoint))
                .setHttpClientConfigCallback(new HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });
        try (RestHighLevelClient client = new RestHighLevelClient(builder)) {
            // Build search request
            SearchRequest searchRequest = new SearchRequest("accounts");

            // Build SearchSource
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(QueryBuilders.queryStringQuery(inputTerm));
            searchSourceBuilder.from(0);
            searchSourceBuilder.size(100);
            searchRequest.source(searchSourceBuilder);

            // Search
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            return Response.status(Response.Status.OK).entity(searchResponse.toString()).build();

        } catch (IOException e) {
            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
        }
    }
}

Bootstrapを使ってアプリケーションの画面を作成します。

<div class="container">
  <div class="row height d-flex justify-content-center align-items-center">
    <div class="col-md-6">
      <div class="form">
        <i class="fa fa-search"></i>
        <input
          type="text"
          class="form-control form-input"
          onkeydown="search(this)"
          placeholder="Search accounts..."
        />
      </div>
    </div>
    <div id="accounts_container" class="col-md-10" style="height:85%"></div>
  </div>
</div>

上記で作成したアプリケーションはこちらをご参照ください。

アプリケーションのデプロイメント

  1. ローカル・マシンから VM インスタンスに接続します。

  2. 下記のコマンドを実行して、ファイアウォールにポート「8080」を追加します。

    sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
    sudo firewall-cmd --reload
    
  3. 下記のコマンドを実行して、git と docker をインストールします。

    sudo yum install git
    sudo yum install docker
    
  4. 下記のコマンドを実行して、作成したアプリケーションをクローンします。

    git clone https://github.com/oracle-japan/OCI_OpenSearch_Handson_App.git
    
  5. アプリケーションの Docker イメージを作成します。

    cd OCI_OpenSearch_Handson_App
    docker build . -t os_app
    
  6. 下記のコマンドを実行して、アプリケーションをデプロイします。

    nohup docker run -p 8080:8080 -e="OPENSEARCH_ENDPOINT=<cluster_API_endpoint>" localhost/os_app &
    

<cluster_API_endpoint>を、クラスタの OpenSearch ダッシュボードの API エンドポイントに置き換えます。

5. アプリケーションのテスト

ローカル・マシンのブラウザから、下記のリンクを開いてアプリケーションにアクセスします。

http://<VM_instance_public_IP>:8080

<VM_instance_public_IP>を VM インスタンスのパブリック IP アドレスに置き換えます。

app_page

検索枠に検索条件を入力して、キーボードの Enter キーを押します。

search_result

関連するアカウント情報が表示されます。

タグ:

更新日時: