elasticsearchのスコア検索が使えそうだわ

elasticsearch_symbol

どうも、こんにちは。なかDでございます。
以前書いた記事『いろんなニュースアプリを(想像で)図解してみた』って記事でもふれたんですが、とあるコンテンツを、キュレーションするアルゴリズムを使って配信出来ないかとリサーチ中でございます。
したらば、エンジニアの方々から『elasticsearch.』っていう、新しくて超カッチョイイ全文検索エンジンがあると聞いたわけです。

はじめに参考にしたブログ記事

まずはじめに、こちらのブログを参考にさせていただきました。試しにインストールして実行してみたのですが、とても解りやすいです。ありがとう御座います。

elasticsearchとは?

特徴としては、おおよそこんな感じでしょうか。
・リアルタイム全文検索エンジン
・リアルタイムアナリティクス
・複数のインデックス
・分散型
・Restful API
・オープンソース
Kibanaというビジュアライズエンジンと組み合わせて、ログの解析にも向いてるみたいですね。(もしかして、全文検索よりも、こっちがメインなのかな?)

導入事例

StumbleUpon


elasticsearchのケーススタディにも掲載されております。
StumbleUponは、ニュース記事をレコメンドしてくれるサービスです。
日に3000万以上の顧客にリアルタイムレコメンドを提供していると紹介されていますね。また、“Powerful and intelligent search”というタグラインが目をひきます。また、以前はApache Solr を使っていたみたいですが、Elasticsearchに乗り換えたとも書かれていますね。どうやらスケールし難かったのが原因の様です。
登録してみると、まずはじめに興味のあるニュースカテゴリーを入力する画面が表示されます。自分の場合は、Design、Internet、Science、Rock Musicというカテゴリーを選択しました。上記のスクリーンショットを見て頂くとわかると思いますが、選択したカテゴリーのニュース記事が不規則な順番で表示されています。画面の上部にGood!とBad!の評価をするボタンがあるのですが、ユーザーの評価データをスコアリングし、レコメンドするシステムの様ですね。

SOUNDCLOUD


SOUNDCLOUDは音楽の共有サービスですね。
検索ページを見ると、Tracks、Playlists、People、Groupsという全くデータ構造の異なるデータ(それぞれがIndex?)があり、「Everything」から横断検索ができる様になっています。
また、ソート順を見ると、日付順でも、Like順でも、シェア順でも無い様です。複数の要素を組み合わせてスコア検索を行っている様ですね。

Elasticsearchの「スコア検索」

elasticsearch.では、検索クエリーを投げる時、インデックスを作成する時、の二箇所でスコアリングのバイアスをかける事が出来ます。
利用者に応じてスコアリングを変更したい際にはクエリーを投げる際に、恒久的なバイアスをかける場合にはインデックスを作成する際に重み付けをできる。という点で、とても魅力的ですね。面白そうだな。

function score query – decay functions

function score query
elasticsearchの検索時のフィルターには「decay functions(偏り関数)」という機能があってこれが使えそうです。
DECAY_FUNCTIONには、gauss(標準偏差)、exp(指数関数)、linear(線形)の3つ。
gauss(標準偏差)の例を見てみます。デフォルトではgaussの設定になります。
こちらは計算式。大学時代に勉強した気もしますが記憶がありません。

gauss(標準偏差)

偏りスコアリング計算結果サンプル

下記は、料金と距離属性を持ったホテルを検索した際の検索例になってます。
横軸は距離、縦軸は料金とし、「できるだけ距離近くて料金も安いホテルはどこ?」という検索に対して、の計算結果例として紹介されています。
計算の結果、左下に配置されている要素ほど、条件に合致した要素となり、スコアが高くなってますね。

偏りスコアリングイメージ

こっちを見ると、グラフの傾き方がgaussっぽい感じがわかりやすいですね。

おわり

elasticsearchですが、インデックス複数作成ができて、検索時のフィルターで偏りのスコアリング検索が出来る。この点でとてもおもしろいと思います。パフォーマンスも良さそうですし。
必要な仕様を実装できるか、検証が必要ですね。

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る