聞いたら一生の宝,プログラミングの基礎の基礎

第8回 Elasticsearchの基礎を学ぶ

この記事を読むのに必要な時間:およそ 2.5 分

はじめに

みなさんこんにちは,teratail開発チームの本橋佑介です。

昨今のWebサービスでは,以前のようにユーザが努力をして興味のあるコンテンツを探すサービスから,キュレーションサービスのようにユーザの興味を分析し配信することが重要とされています。

以前からも,ユーザの動向を分析するために,開発者はさまざまな手段を用いてユーザの興味に合った情報を配信することを実現してきましたが,得られるデータがユーザのサービス内のアクティビティのみだったため,決して精度が高いものとは言えませんでした。

現在では,莫大で多様なデータを取得することが可能になったため,ユーザの興味に近い情報を分析することが可能になりました。そのため,データをそのまま蓄積するだけではなく,各データに属性や情報を付与するなど,高度で柔軟性の高い検索・分析が行える全文検索システムに注目が集まっています。

Luceneという全文検索エンジンを利用しているApacheライセンス下のSolrと,Elastic社の元でOSSとして開発されてるElasticsearchが多く採用されていますが,ここではFacebookやGitHubなどで利用され,teratailでも導入されているElasticsearchについて取り上げたいと思います。

※)
全文検索エンジンとは,大量にある文書の中から目的のワードを持つ文書を検索するための検索エンジンです。

Elasticsearchの特徴

Elasticsearchの最大の特徴として,以下の2つのキーワードがあります。

  • クラスタ
  • REST API
スケーラブルで柔軟な設計
クラスタ構成が前提で実装されているため,同一のクラスタ名で用意するだけでレプリカが自動で実行されます。また,データのマッピングを定義せずにデータの投入が可能なため,蓄積した後に利用したい形に変更することが可能です。
REST-API
設定ファイルも利用可能ですが,RESTインターフェースですべての入出力が可能です。HTTPで接続可能なので開発環境を選びません。

上記の特徴以外にも,Elastic社が提供している強力な可視化ツールであるKibana,Elasticsearchのセキュリティ管理をするShield,データの監視をするWatcherなど,さまざまなサービスが提供されています。

RDBMSとの対比

OracleやPostgreSQLなどのRDBMSとElasticsearchの違いはどこにあるのでしょうか。

データを蓄積するものとデータを取り出すものという思想の違いがありますが,一番大きいのはRDBMSは条件にマッチしたデータを正確に返すのと比べ,Elasticsearchは条件との関係性の高いデータを返すという点があります。

たとえば,賃貸物件検索などを行う場合,以下のような条件で検索することがよくあります。

  • 駅から1km以内
  • 2階以上
  • 10万円以内

RDBMSでこのQueryを流した場合,完全に一致したものを返すため,物件情報が存在しなかったら0件のデータを返しますが,Elasticsearchでは,たとえば駅から1.1kmであっても他の2件の条件が満たされていたら,そのデータを返します。

上記のようにデータの取り扱いも違いますが,構成を表す言葉も以下のように違っています。

Node = DBインスタンス
Cluster = Databaseクラスター
Index = Databaseスキーマ
Mapping Type = Table

検索結果の関連度

検索結果では,完全一致ではなく関連度の高いものを返すとありますが,関連度はどのように決定されているのでしょうか。

Elasticsearchの関連度にはスコアというものが設定されています。1ワードの検索ではこのスコアの算出にはTF/IDF(Term Frequency/Inverse Document Frequency)という考え方が採用されています。

たとえば,gihyo.jpのような記事サービスの詳細ページの文書が入ったtypeにElasticsearchというワードを検索するクエリを流したとします。

この考えでは文書と検索ワードの関連度は,文書内でのワードの出現頻度で決定されます。また,関連度合いの重み付けとしてワードの短さというものも重要視されます。これは長い本文中に一度だけ引用として記載されたことよりも短いタイトル上に表記されたほうが検索ワードとの関連性が高いと判断することになります。

著者プロフィール

本橋佑介(もとはしゆうすけ)

レバレジーズ株式会社 teratail開発責任者。

フロントエンド,バックエンドの開発に携わりUIデザインなども担当。最近の興味はPostgreSQLとオーディオ。自作アンプ沼にはまらないように戦っている。

コメント

コメントの記入