38
おでかけスポット検索 のむずかしさ - Holidayを支える検索技術 Cookpad TechConf 2016

おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Embed Size (px)

Citation preview

Page 1: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

おでかけスポット検索 のむずかしさ

- Holidayを支える検索技術

Cookpad TechConf 2016

Page 2: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

自己紹介

• 内藤 雄介(ないとうゆうすけ)

• おでかけプラン作成・共有サービス「Holiday」の開発

• サーバサイドの開発を担当

Page 3: おでかけスポット検索のむずかしさ - Holidayを支える検索技術
Page 4: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

いつもの休日のおでかけを 楽しくすることで 人生を豊かにする

Page 5: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Holidayでの検索

Page 6: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Holidayでの検索

! フリーワード

Page 7: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Holidayでの検索

!

どこで だれとx

中目黒 デート

Page 8: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Holidayでの検索

どこで だれとxいつ

! 中目黒 冬

Page 9: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Holidayでの検索

どこで だれとxいつなにを

! 中目黒 散歩

Page 10: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Holidayでの検索

! どこで

Page 11: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

これまでは...

=> 全文検索

Page 12: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

全文検索だけでは うまくいかなかった

Page 13: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

「中目黒、中目黒にない」問題

Page 14: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

ユーザが考える「中目黒」

• 目黒川沿いのおしゃれなカフェ・雑貨点が集まっているエリア

• 中目黒駅前の商店街エリア

Page 15: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

ユーザが考える「中目黒」

Page 16: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

住所としての「中目黒」

Page 17: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

2つの「中目黒」の差

Page 18: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

「駅周辺を探せない」問題

Page 19: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

駅名で検索するということは

• 「駅から『徒歩圏内』で『なるべく近く』で遊べるところないかな」と考えていそう

• 住所文字列から距離は測れない

=> 結果順に反映できない

Page 20: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

課題

• スポット名・住所からの全文検索では...

• 一般認識とは違ったエリアを探してしまう

• 駅からの距離を結果に反映できない

Page 21: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

「全文検索」x「地理検索」

Page 22: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Elasticsearch

Page 23: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

これまで

“中目黒 カフェ”! 中目黒 カフェ

Page 24: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

改善後

“カフェ”

“中目黒”

" { 位置情報 }

! 中目黒 カフェ

AND

or

must

Page 25: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Elasticsearchでの地理検索

• Geo Distance Filter

• Geo Polygon Filter

• Geo Bounding Box Filter

※Elasticsearch2系ではQueryとして実装されてます

Page 26: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Geo Distance Filter

• 中心点からの距離で絞り込む

• 駅周辺のスポットを探すなどのケースに適している

Page 27: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Geo Polygon Filter

• 多角形で範囲を指定する

• 複雑なエリアの場合に使用する

Page 28: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

Geo Bounding Box Filter

• 地理検索オプションの中で、最も高速に動作

• 正確さが求められないならこれを使うと○

Page 29: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

地名を判別するために

• 形態素解析の強化

• mecab-ipadic-NEologd の導入

• 新語・流行語

• 全国駅名一覧

• 同義語管理

Page 30: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

地名の判別 - 辞書の強化

{ "tokens" : [ { "token" : "中", "start_offset" : 0, "end_offset" : 1, "type" : "word", "position" : 1 }, { "token" : "中目黒", "start_offset" : 0, "end_offset" : 3, "type" : "word", "position" : 1 }, { "token" : "目黒", "start_offset" : 1, "end_offset" : 3, "type" : "word", "position" : 2 }, { "token" : "駅", "start_offset" : 3, "end_offset" : 4, "type" : "word", "position" : 3 } ]}

{ "tokens" : [ { "token" : "中", "start_offset" : 0, "end_offset" : 1, "type" : "word", "position" : 1 }, { "token" : "中目黒駅", "start_offset" : 0, "end_offset" : 4, "type" : "word", "position" : 1 }, { "token" : "目黒駅", "start_offset" : 1, "end_offset" : 4, "type" : "word", "position" : 2 } ]}

with NEologd

$ curl -XGET 'localhost:9200/index/_analyze' -d '中目黒駅'

kuromoji(Default)

Page 31: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

地名の判別 - 辞書の強化

kuromoji(Default)

{ "tokens" : [ { "token" : "奥", "start_offset" : 0, "end_offset" : 1, "type" : "word", "position" : 1 }, { "token" : "渋谷", "start_offset" : 1, "end_offset" : 3, "type" : "word", "position" : 2 } ]}

{ "tokens" : [ { "token" : "奥", "start_offset" : 0, "end_offset" : 1, "type" : "word", "position" : 1 }, { "token" : "奥渋谷", "start_offset" : 0, "end_offset" : 3, "type" : "word", "position" : 1 }, { "token" : "渋谷", "start_offset" : 1, "end_offset" : 3, "type" : "word", "position" : 2 } ]}

with NEologd

$ curl -XGET 'localhost:9200/index/_analyze' -d '奥渋谷'

Page 32: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

結果

認識通りのエリアが探せる!

! 中目黒 デート

Page 33: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

結果

駅周辺から距離順に探せる!

! 目黒駅 デート

Page 34: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

結果

住所じゃなくても探せる!

! 奥渋谷 デート

Page 35: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

まとめ

• 「どこで」を探すには全文検索では不十分

• 「地理検索」を組み合わせることで、よりよい検索体験を作れる

• Elasticsearchは地理検索するにも便利!

Page 36: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

ご静聴ありがとうございました

Page 37: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

おまけ

Page 38: おでかけスポット検索のむずかしさ - Holidayを支える検索技術

「駅名」での検索の場合

• 駅周辺のスポットを検索

• 駅からの距離に応じてスコアを調整

• Elasticsearchでは

• Function Score Query を使う

• 詳しくは http://techlife.cookpad.com/entry/2015/03/12/080000