Upload
yusuke-naito
View
33.821
Download
4
Embed Size (px)
Citation preview
おでかけスポット検索 のむずかしさ
- Holidayを支える検索技術
Cookpad TechConf 2016
自己紹介
• 内藤 雄介(ないとうゆうすけ)
• おでかけプラン作成・共有サービス「Holiday」の開発
• サーバサイドの開発を担当
いつもの休日のおでかけを 楽しくすることで 人生を豊かにする
Holidayでの検索
Holidayでの検索
! フリーワード
Holidayでの検索
!
どこで だれとx
中目黒 デート
Holidayでの検索
どこで だれとxいつ
! 中目黒 冬
Holidayでの検索
どこで だれとxいつなにを
! 中目黒 散歩
Holidayでの検索
! どこで
これまでは...
=> 全文検索
全文検索だけでは うまくいかなかった
「中目黒、中目黒にない」問題
ユーザが考える「中目黒」
• 目黒川沿いのおしゃれなカフェ・雑貨点が集まっているエリア
• 中目黒駅前の商店街エリア
ユーザが考える「中目黒」
住所としての「中目黒」
2つの「中目黒」の差
「駅周辺を探せない」問題
駅名で検索するということは
• 「駅から『徒歩圏内』で『なるべく近く』で遊べるところないかな」と考えていそう
• 住所文字列から距離は測れない
=> 結果順に反映できない
課題
• スポット名・住所からの全文検索では...
• 一般認識とは違ったエリアを探してしまう
• 駅からの距離を結果に反映できない
「全文検索」x「地理検索」
Elasticsearch
これまで
“中目黒 カフェ”! 中目黒 カフェ
改善後
“カフェ”
“中目黒”
" { 位置情報 }
! 中目黒 カフェ
AND
or
must
Elasticsearchでの地理検索
• Geo Distance Filter
• Geo Polygon Filter
• Geo Bounding Box Filter
※Elasticsearch2系ではQueryとして実装されてます
Geo Distance Filter
• 中心点からの距離で絞り込む
• 駅周辺のスポットを探すなどのケースに適している
Geo Polygon Filter
• 多角形で範囲を指定する
• 複雑なエリアの場合に使用する
Geo Bounding Box Filter
• 地理検索オプションの中で、最も高速に動作
• 正確さが求められないならこれを使うと○
地名を判別するために
• 形態素解析の強化
• mecab-ipadic-NEologd の導入
• 新語・流行語
• 全国駅名一覧
• 同義語管理
地名の判別 - 辞書の強化
{ "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)
地名の判別 - 辞書の強化
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 '奥渋谷'
結果
認識通りのエリアが探せる!
! 中目黒 デート
結果
駅周辺から距離順に探せる!
! 目黒駅 デート
結果
住所じゃなくても探せる!
! 奥渋谷 デート
まとめ
• 「どこで」を探すには全文検索では不十分
• 「地理検索」を組み合わせることで、よりよい検索体験を作れる
• Elasticsearchは地理検索するにも便利!
ご静聴ありがとうございました
おまけ
「駅名」での検索の場合
• 駅周辺のスポットを検索
• 駅からの距離に応じてスコアを調整
• Elasticsearchでは
• Function Score Query を使う
• 詳しくは http://techlife.cookpad.com/entry/2015/03/12/080000