elasticsearch勉強会
elasticsearch勉強会
percolatorのユースケース
アラート
インデックスが特定のクエリにマッチしたら教えてくれ。広告出稿する場合
ユーザがサイト検索する
アパートを検索して結果を表示するが
新しいマッチする物件が出たら知りたい
どのメールに通知すればいいのかみたいなのを取得して通知することができる分類
ニュースサイトやブログがあってカテゴリわされている
カテゴリは検索として表現できる
ニュースに地域などの属性があれば東京のニュース一覧とかできる
どの記事がどの地域に属するかというのを設定するにはどうしたら良いか
percolation queryを使えばどの記事がどの地域に属するかということを簡単に設定できる。
記事をかいてpercolationを使えばその記事のカテゴリを得られるgroclassificationについて
例えば緯度経度を使って検索することもできるけど検索はめんどい
percolationを使ってこのお地域はどの地域内にあるみたいなことも。言語の検出にも使える
日本語は簡単だけどラテン語なんかは難しい
特定の言語固有の単語などもあるのでこの言語にしかない単語をpercolationクエリとして
設定しておけば言語判別できるpercolatorにはメタデータを設定できる
いつそのクエリが保存されたのかなどなど
課金している人にのみ通知したい場合、課金しているかという情報もメタデータになる
そのメタデータによって通知の頻度を変えるとかもできるハイライトをできる
特定のトピックについて通知をしてもらいたい場合
トピックをpercolatorとして保存しておいて結果をハイライトできる
これが reverse search
esとRDBMSを検索するのはどう違うか
単にマッチするかどうかだけでなく、関連性も検出できる
TF-IDF
TF term frequency : 単語の出現頻度、頻度により関連性を調べられる。
IDF : どれくらいドキュメント内でレアかどうか
例えばisとかtheとか検索してもほぼ全部のドキュメントに出てくるので
あんまり関連性の重要性には寄与しない。
luceneはTF-IDF以外にもフィールドの長さを加味する
東京の本で東京について検索した場合たくさんヒットするけど
その中のタイトルでヒットすれば関連性が高いと言える
function scoreという機能を使えばドキュメント自体に
格納されていない情報も検索のタイミングでスコア算出につかうことができる
映画を検索した場合、映画のレビュー情報も算出できる。
レビューの星の数だけでソートしないほうがいいですね?
それだけでランクが決まってしまうので。
でも少しだけ順序に入れると良い。。
ホテルを検索する例
grand hotelというホテルを検索
指定した地点から1km以内がいいと指定した場合、1km以内であれば完全にマッチとするけど
そこから離れていても検査くっかに入れる
バルコニーが欲しいと指定した場合、バルコニーがなくても検索結果に入れる
でもバルコニーがあればより検索結果の上位に出すようにする
populartyというフィールド(レビュー)もランクに加味する
さらに幾分ランダムも入れる。つど発見があるように。
これらのウェイトはチューニング可能。
esは単語の頻度だけではなくいろんな情報を持っている。
aggregationについて
facetsともいう。
githubの検索結果の左側のようなやつ。
検索結果の中から検出したものでオーバービュートなる(どの言語がどれくらいあるかとか)
esを使うことで多次元の情報を見ることができる。
グラフ化するだけならRDBMSでもでk里う。
レコメンデーション
音楽について、特定のアーティストをlikeしているかどうか。
誰がどのアーティストをlikeしているのかという情報を格納する。
レコメンドする方法としてアーティストを検索して
さらにアーティストをlikeしている人を算出。
でも人気は必ずしも寒冷生徒はなりません。
termsでaggregateする代わりにsignificant term というものを使う。
これはaggregationの一種で単に人気があるということだけでなく、
特定のグループ内で突出しているものを調べられる。
アーティストを、誰が、likeしているのかという情報持っているし、
転値インデックスもあるので検出できる。
バンドをlikeした人数と、その検索termでlikeした人数を比較すれば
突出したものを検知することができる。sampler aggregation es2.0の新機能
例えば1ユーザにつき1ドキュメントだけ、とかできる。
1ユーザが何百ドキュメントを持っている場合効率的。
自分と同じものをよりたくさんlikeしている人は近い傾向を持っているとわかる。
誰もが好きなバンドをlikeしているというのはあまり参考にならないが
レアなバンドであれば大変好みが近いと言える(TF-IDFの応用)
sampler aggregationを使えばより効率的に、すばやくレコメンデーションできる。wikipediaの記事をグラフ化した場合、各記事同士がたくさんリンクしている。
共通のコネクションが大事。
たくさん調べればスーパーノード(共通してリンクしているノード、記事)がわかる
でも、人名が人物とリンクしているという情報なんかは意味があまりない。カンファレンスで、どのwebサイトによく行きますか?と聞いたら
githubとかstackoverflowと答えが出るでしょう。
googleではなく、これがカンファレンス特有の答えです。人間が、世の中をどういう風に見ているのかと同じ考え方。
データを期間で区切って調べる(週とか時間とかで)
signficant term を調べたら何が得られるか?例えばハッシュタグで。
その日で他の人に比べてたくさん使われているハッシュタグがわかる。
トレンドがわかる。
情報は力です。esを使えばよりたくさんの情報が得られる。