You are currently viewing OpenSearchでなにか作るぞ!(その5 アイコンデータに対応させる)

OpenSearchでなにか作るぞ!(その5 アイコンデータに対応させる)

前回までで一旦OpenSearchにドキュメントを登録するところまで出来ました。
今回はカラムにArrayタイプのデータを登楼して、アイコン(DAnimeで言うR15+やレンタルなど)を検索出来るようにします。

OpenSearchのMappingを改修する

現在のマッピング定義にアイコン情報を格納するカラムが存在しないので、追加します。

・・・省略
        "end_of_delivery": {
        "type": "integer"
        },
        "work_icons":{ ←これを追加
          "type" : "keyword"
        },
        "created_at": {
        "type": "date"
        },
        "updated_at": {
        "type": "date"
        }
・・・省略

ちなみに、OpenSearchには「Array型」というものは存在しないようで、上記のように通常のカラムを追加し、登録時に配列でデータを渡すことで1カラムに複数データを格納できる仕様になっているみたいです。

BulkInsertバッチを改修する

マッピングが修正できたら、バルクインサートバッチを改修します。
DBに保存しているアイコン情報をgroup_condatでカンマ区切りで取得し、OpenSearch登録時にカンマ区切りから配列に変換して登録して見るようにしました。

・・・省略
	" ,IFNULL(group_concat(a_icon.work_icons), '') AS work_icons " + ←ここを追加
	" ,a_list.created_at" +
	" ,a_list.updated_at" +
	" FROM d_anime.anime_list a_list " +
	" LEFT JOIN d_anime.work_icon a_icon " +
	" ON a_list.work_id = a_icon.work_id " +
	" GROUP BY a_list.work_id"

OpenSearch登録用の構造体を別途作成し、アイコン情報を配列に変換して渡してみます。

・・・省略
		tmp.EndOfDelivery = result[i].EndOfDelivery
		if result[i].WorkIcons == "" {
			tmp.WorkIcons = []string{} ←データが無ければ、空の配列を設定
		} else {
			tmp.WorkIcons = strings.Split(result[i].WorkIcons, ",") ← カンマ区切りから配列に変更
		}
		tmp.CreatedAt = result[i].CreatedAt
		tmp.UpdatedAt = result[i].UpdatedAt
・・・省略

実際にバルクインサート用のデータを作成すると、以下のようになります。

R15作品の例
{ "index" : { "_index" : "d_anime", "_id" : "7a26cf047bd32d6771cc68057834d37d15d30eee4dfc6d6e62bcb9450d7faff1" } }
{"work_id":24959,"work_title":"みこすり半劇場","link":"https://animestore.docomo.ne.jp/animestore/ci?workId=24959","main_key_visual_path":"https://cs1.animestore.docomo.ne.jp/anime_kv/img/24/95/9/24959_1_2.png?1627875034000","main_key_visual_alt":"みこすり半劇場_2","my_list_count":2519,"favorite_count":2644,"age_limit_type":2,"end_of_delivery":0,"work_icons":["r15"],"created_at":"2023-07-16T16:27:00+09:00","updated_at":"2023-07-16T16:27:00+09:00"}
アイコン情報が無い作品の例
{ "index" : { "_index" : "d_anime", "_id" : "74b3114fda6e38fe1c36f5cbd0909c955d3e47d47fcf98d808075e3a8f4cbc5a" } }
{"work_id":24953,"work_title":"マギアレコード 魔法少女まどか☆マギカ外伝 Final SEASON –浅き夢の暁-","link":"https://animestore.docomo.ne.jp/animestore/ci?workId=24953","main_key_visual_path":"https://cs1.animestore.docomo.ne.jp/anime_kv/img/24/95/3/24953_1_2.png?1647568836875","main_key_visual_alt":"マギアレコード 魔法少女まどか☆マギカ外伝 Final SEASON –浅き夢の暁-_2","my_list_count":12820,"favorite_count":26865,"age_limit_type":0,"end_of_delivery":0,"work_icons":[],"created_at":"2023-07-16T16:26:45+09:00","updated_at":"2023-07-16T16:26:45+09:00"}

検索を行い、確認する

これでアイコン情報がインデックスに登録出来たので、検索出来るのか確認してみます。

R15作品を検索したところ、18作品ヒットしました。そのうちの一つを実際のサイトで確認してみます。

土下座で頼んでみた を確認したところ、きちんとR15指定の作品になっていました。
これで、レンタルや期間限定、R15作品を個別に検索するための下準備を作ることが出来ました。

R15作品については、本当に正しい検索結果になっているか検証が必要なので、本日はこのあたりで失礼します。

コメントを残す