✨
Pythonを使ってYouTubeのデータをAlgoliaにインポートする
YouTube のチャンネルにアップロードされている動画の情報を Algolia にインポートしたときのメモです。
データの準備
YouTube Data API
を使うとチャンネルなどから動画の情報が取得できます。
[
{
"id": "mIWVTfXEPMY",
"snippet": {
"description": "動画を見ていただいて楽しんで頂けましたら...",
"publishedAt": "2022-03-14T11:25:27Z",
"thumbnails": {
"default": {
"height": 90,
"url": "https://i.ytimg.com/vi/mIWVTfXEPMY/default.jpg",
"width": 120
},
"high": {
"height": 360,
"url": "https://i.ytimg.com/vi/mIWVTfXEPMY/hqdefault.jpg",
"width": 480
},
"medium": {
"height": 180,
"url": "https://i.ytimg.com/vi/mIWVTfXEPMY/mqdefault.jpg",
"width": 320
},
"standard": {
"height": 480,
"url": "https://i.ytimg.com/vi/mIWVTfXEPMY/sddefault.jpg",
"width": 640
}
},
"title": "正直、専門店よりウマいです。..."
},
"statistics": {
"likeCount": "2486",
"viewCount": "100258"
}
},
...
]
詳細はこちらに書きました。
Algolia にインポートするデータの形式
上記のデータを Algolia にインポートするにあたって、扱いやすくするために次のような JSON に整形しました。
[
{
"objectID": "mIWVTfXEPMY",
"id": "mIWVTfXEPMY",
"title": "正直、専門店よりウマいです。...",
"description": "動画を見ていただいて楽しんで頂けましたら...",
"published": "2022-03-14T11:25:27Z",
"published_timestamp": 1647257127,
"views": 172674,
"likes": 3617,
"image": "https://i.ytimg.com/vi/mIWVTfXEPMY/sddefault.jpg",
"url": "https://www.youtube.com/embed/mIWVTfXEPMY"
},
...
]
- Algolia 上でのレコードのユニーク識別子
objectID
を追加(今回はid
を識別子に利用)- Algolia 側で自動的に付与させることもできる(autoGenerateObjectIDIfNotExist)
- データの更新を考えて YouTube 側のユニーク ID(VideoID) を振った
- 検索結果をソートするために
views
とlikes
は数値に変換した - 日付順でソートするために
published
をunixtimestamp
に変換したpublished_timestamp
を追加-
ISO 8601
形式の日時の文字列が Algolia ではソートできないため - https://www.algolia.com/doc/guides/managing-results/refine-results/sorting/how-to/sort-an-index-by-date/
-
データの投入
公式のサンプルコードをほぼそのまま利用して登録できました。
def save_to_algolia(objects):
client = SearchClient.create(ALGOLIA_APP_ID, ALGOLIA_API_KEY)
index = client.init_index(ALGOLIA_INDEX_NAME)
index.save_objects(objects)
# set searchable attributes and languages.
index.set_settings({
'searchableAttributes': [
'title',
'description'
],
'customRanking': [
'desc(published_timestamp)'
],
'indexLanguages': ['ja'],
'queryLanguages': ['ja'],
}).wait()
set_settings
でindex
の設定を変更します。
searchableAttributes
にtitle
とdescription
を指定しています、指定しなくても(デフォルトで)全てのフィールドが検索対象になるのですが、明示的に設定することで検索ノイズを減らせる場合があります。
customRanking
は検索結果を何を基準にランキングするかの指定です。sort との使い分けが分かりづらいのですが、リファレンスによると何らかの基準でランキングするのが良いと書かれています。この例では日付(降順)を指定しました。
indexLanguages
とqueryLanguages
にja
を設定することで日本語検索の精度が高くなります。例えばたまねぎ
で検索した際に玉ねぎ
といったワードも引っかかるようになりました。
日時
、閲覧回数
、いいね
でソートした検索結果を出力するためにインデックスのレプリカを作成してランキングを設定します。
# create replica and configure.
attributes = ["published_timestamp", "views", "likes"]
index.set_settings({
'replicas': [f'{ALGOLIA_INDEX_NAME}_{attribute}_desc' for attribute in attributes]
})
for attribute in attributes:
replica_index = client.init_index(f'{ALGOLIA_INDEX_NAME}_{attribute}_desc')
replica_index.set_settings({
'ranking': [
f'desc({attribute})', # sort by attribute.
'typo',
'geo',
'words',
'filters',
'proximity',
'attribute',
'exact',
'custom'
]
})
Algolia の管理画面からデータを確認できます。
サンプルコード
サンプルコードは GitHub にアップロードしています。
参考資料
Discussion