You are currently viewing OpenSearchでなにか作るぞ!(dAnimeリメイク その2)

OpenSearchでなにか作るぞ!(dAnimeリメイク その2)

前回まででスクレイピングとOpenSearchへの登録を作成しました。
今回はサーバーサイド側の開発として、まずはOpenSearchへの接続部分を作成しようと思います。

Go + Echoの組み合わせ

フロントから直接OpenSearchに検索を行っても良い気がしますが、今回は間にGoを挟んで、検索条件の精査やフロントで扱いやすいようにレスポンスデータを整形したりする処理を行います。

OpenSearchへの接続

OpenSearchへの接続は以下のようにしてみました。

// OpenSearchに接続する
func connectOpenSearch() (*opensearch.Client, error) {

	openSearch := os.Getenv("OPEN_SEARCH_SERVER")
	if openSearch == "" {
		openSearch = config.OPEN_SEARCH_SERVER
	}
	openSearchUser := os.Getenv("OPEN_SEARCH_USER")
	if openSearchUser == "" {
		openSearchUser = config.OPEN_SEARCH_USER
	}
	openSearchPassword := os.Getenv("OPEN_SEARCH_PASSWORD")
	if openSearchPassword == "" {
		openSearchPassword = config.OPEN_SEARCH_PASSWORD
	}

	client, err := opensearch.NewClient(opensearch.Config{
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
		},
		Addresses: []string{openSearch},
		Username:  openSearchUser,
		Password:  openSearchPassword,
	})

	if err != nil {
		return nil, err
	}

	return client, nil
}

OpenSearchのサンプルコードを、環境変数を利用するように置き換えただけですね。
os.Getenv()を利用することで、開発中はコンフィグファイルの設定を、本番環境では環境変数の値を利用する想定で作成しています。

OpenSearchのサンプルはこちら
https://opensearch.org/docs/latest/clients/go/

クエリを実行し、レスポンスを取得する

実際にクエリを実行し、レスポンスを取得します。
取得したレスポンスはjson.Unmarshalを利用して構造体に設定しました。

// 検索を実行する
func Search(client *opensearch.Client) (result types.SearchResponse, err error) {

	content := strings.NewReader(`{
		"size": 5,
		"query": {
			"match_all": {}
		  }
	}`)

	search := opensearchapi.SearchRequest{
		Index: []string{"d_anime"},
		Body:  content,
	}

	var res types.SearchResponse
	searchResponse, err := search.Do(context.Background(), client)
	if err != nil {
		return res, err
	}
	defer searchResponse.Body.Close()

	body, err := io.ReadAll(searchResponse.Body)
	if err != nil {
		return res, err
	}

	err = json.Unmarshal(body, &res)
	if err != nil {
		return res, err
	}

	return res, nil
}

予めOpenSearchのレスポンスJSONからgoのstructを作成しておきます。
今回はこれを使ってみました

今回はmatch allを利用したため全データ(うちの5件)が返ってきます。

少しハマったところとして、OpenSearchの検索結果のBodyはio.ReadAllで取得しないと中身が空っぽのように見えたので少し焦りました。

上記のプログラムのレスポンスは以下のようになります。

以上

というところで、一旦goを利用してOpenSearchに検索がかけられたところまでにします。
次回は簡単な検索条件を指定し、その条件に基づいて検索を行えるように考えていこうと思います。

コメントを残す