Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

36,327 views

Published on

2016.01.23
Cookpad TechConf 2016
http://techconf.cookpad.com/

Published in: Engineering
  • Hello! High Quality And Affordable Essays For You. Starting at $4.99 per page - Check our website! https://vk.cc/82gJD2
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

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

×