📖

Elasticsearchの辞書運用を捨て、マッピング設計で解決したFilmarksのデプロイレス略称検索

に公開

はじめに

株式会社つみきの内迫と申します。映画・ドラマ・アニメのレビューサービス「Filmarks(フィルマークス)」のサーバーサイド開発を担当しています。

本記事では、Filmarksにおける略称での検索についてご紹介します。

Filmarksとは

FilmarksはiOS/AndroidアプリとWebで提供する、映画・ドラマ・アニメのレビューサービスです。
累計レビュー数は2億件を突破し、多くのユーザーに利用されています。

略称

映画・ドラマ・アニメには、作品によって、一般的な略称があったりします。

例)
ワイルド・スピード -> ワイスピ
僕のヒーローアカデミア -> ヒロアカ
アナと雪の女王 -> アナ雪
逃げるは恥だが役に立つ -> 逃げ恥

Elasticsearchのような検索エンジンで、略称での検索を可能にするには、辞書を使うことが多いのではないでしょうか。
ところが、辞書の運用管理は、辞書ファイルの更新・各ノードへの配布・再インデックスといったデプロイが発生して大変です。そこでFilmarksでは別の方法を採用したので、ご紹介します。

Filmarksにおける略称の扱い

Filmarksでは検索用のフィールドとして、作品名・かな・原題を持っています。ここに別題のフィールドを追加し、作品登録の1項目として扱うことにしました。

mappingの抜粋

        "title": {
          "type": "text",
          "index": "true",
          "analyzer": "kuromoji_neologd"
        },
        "kana": {
          "type": "text",
          "index": "true",
          "analyzer": "ngram_ja_analyzer"
        },
        "original_title": {
          "type": "text",
          "index": "true",
          "analyzer": "kuromoji_neologd"
        },
        "alternative_titles": {
          "type": "text",
          "index": "true",
          "analyzer": "whitespace_lowercase"
        },

title: 作品名
kana: かな
original_title: 原題
alternative_titles: 別題

別題は、whitespaceで分割することで、複数の別題を登録可能にしています。

検索時のマッチング仕様

ユーザーが検索を行うと、入力されたキーワードは title・kana・original_title・alternative_titles の各フィールドに対してクエリが発行されます。
たとえば「ヒロアカ」と検索された場合、以下のようにマッチします。

title: 僕のヒーローアカデミア(形態素解析でヒットしないことも多い)
alternative_titles: ヒロアカ(完全一致でヒット)

alternative_titles に略称を登録しておくことで、辞書を管理しなくとも一般的な呼び名で検索できる状態を実現できます。

運用フロー

別題(略称)の登録は、作品登録チームにより作品登録時や情報の更新時に、作品情報として登録しています。

辞書ファイルを直接更新する必要がないため、デプロイレスで柔軟に対応できます。

効果

この方法を採用したことで、以下のような効果が得られました。

  • 運用コストの削減
    辞書ファイルの編集・再デプロイが不要になり、管理対象も最小限に。

  • 検索体験の向上
    正式名称を知らないユーザーでも、普段使いの呼び方で作品にたどり着ける。

最後に

Filmarks では「検索したい言葉でヒットする体験」のため、今後も改善していきます。

つみきではこのような活動を行いながら日々Filmarksの成長を支えるエンジニアを募集しています!

Filmarks Engineering Blog

Discussion