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

Preview:

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

Recommended