Pythonを使ってYouTubeのデータをAlgoliaにインポートする

2022/03/17に公開

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"
    }
  },
  ...
]

詳細はこちらに書きました。
https://zenn.dev/yorifuji/articles/youtube-data-api-python

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"
  },
  ...
]

データの投入

公式のサンプルコードをほぼそのまま利用して登録できました。

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_settingsindexの設定を変更します。

searchableAttributestitledescriptionを指定しています、指定しなくても(デフォルトで)全てのフィールドが検索対象になるのですが、明示的に設定することで検索ノイズを減らせる場合があります。

https://zenn.dev/yorifuji/articles/algolia-first-step#検索対象のデータ(属性)を明示的に指定する

customRankingは検索結果を何を基準にランキングするかの指定です。sort との使い分けが分かりづらいのですが、リファレンスによると何らかの基準でランキングするのが良いと書かれています。この例では日付(降順)を指定しました。

https://www.algolia.com/doc/guides/managing-results/must-do/custom-ranking/

indexLanguagesqueryLanguagesjaを設定することで日本語検索の精度が高くなります。例えばたまねぎで検索した際に玉ねぎといったワードも引っかかるようになりました。

https://zenn.dev/yorifuji/articles/algolia-first-step#日本語を含むデータを検索するときにやること

日時閲覧回数いいねでソートした検索結果を出力するためにインデックスのレプリカを作成してランキングを設定します。

    # 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 にアップロードしています。
https://github.com/yorifuji/ImportYouTubeDataToAlgolia

参考資料

https://www.algolia.com/doc/api-client/getting-started/what-is-the-api-client/python/?client=python

https://github.com/algolia-samples/api-clients-quickstarts/tree/master/python

Discussion