前回まででスクレイピングと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に検索がかけられたところまでにします。
次回は簡単な検索条件を指定し、その条件に基づいて検索を行えるように考えていこうと思います。
created by Rinker
¥2,673
(2024/10/27 14:06:47時点 Amazon調べ-詳細)
created by Rinker
¥3,960
(2024/10/27 13:52:05時点 楽天市場調べ-詳細)