Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Elasticsearchによる 全文検索の実装 in Rails

9278c3a06b8d8752fb913dea93f959c1?s=47 FUJI Goro
March 24, 2018

Elasticsearchによる 全文検索の実装 in Rails

Rails Developers Meetup 2018 (#railsdm) の発表資料です。

9278c3a06b8d8752fb913dea93f959c1?s=128

FUJI Goro

March 24, 2018
Tweet

Transcript

  1. ElasticsearchʹΑΔ શจݕࡧͷ࣮૷ in Rails #railsdm by FUJI Goro (gfx)

  2. ࠓ೔࿩͢͜ͱ • ΢ΣϒαʔϏεͰશจݕࡧΛఏڙ͢Δͱ͖ʹ ͱ͖ʹߟ͑Δ͜ͱ • ElasticsearchʹΑΔશจݕࡧʹ͓͚Δ඼࣭ͷ ੍ޚʹ͍ͭͯ

  3. ࠓ೔࿩͞ͳ͍͜ͱ • Elasticsearch vs ଞͷશจݕࡧΤϯδϯ • ϚωʔδυαʔϏε vs ࣗલ •

    ಛఆͷ elasticsearch client library ͷ࿩ • e.g. elasticsearch-rails, searchkick, elastomer-client
  4. ൃදऀʹ͍ͭͯ • ໊લ: gfx / ౻ޗ࿠ • ৘ใڞ༗αʔϏεKibelaΛ։ൃ͍ͯ͠Δ • Kibela͸

    Ruby on Rails੡αʔϏε • લճͷrailsdmͰ͸ʮϚϧνςφϯτɾ΢ΣϒΞϓϦέʔ γϣϯͷ࣮ફʯͱ͍͏ൃදΛͨ͠ • KibelaͰ͸ Amazon Elasticsearch Service Λར༻
  5. ΢ΣϒαʔϏεͰશจݕࡧΛ ఏڙ͢Δͱ͖ʹߟ͑Δ͜ͱ

  6. શจݕࡧ in ΢ΣϒαʔϏε • ඼࣭Λ্͛Δʹ͸ఔ౓ίετֻ͕͔Δ • ≒ίετΛֻ͚Δ΄Ͳʹ඼࣭Λ্͛ΒΕΔ • Ͳͷ͘Β͍ίετΛֻ͚ΒΕΔ͔Ͱ΍Δ͜ͱ͕ ͔ͳΓมΘΔ

    • ίετΛֻ͚ΒΕͳ͍ͳΒͦ΋ͦ΋શจݕࡧ͸ ෆཁ͔΋͠Εͳ͍
  7. ݕࡧͷ඼࣭ • ݕࡧͷ඼࣭͸Ұൠʹʮద߹཰ʯͱʮ࠶ݱ཰ʯ ͰݟΔ • ద߹཰͸ʮਖ਼֬ੑʯͱ΋͍͏ • ࠶ݱ཰͸ʮ໢ཏੑʯͱ΋͍͏

  8. ద߹཰ vs ࠶ݱ཰ • ద߹཰:ʮݕࡧ͞Εͨద߹จॻͷ਺ ÷ ݕࡧ݁Ռͷจॻͷ ਺ʯ • ద߹཰͕ߴ͍ͱʮݕࡧ݁Ռͷଟ͕͘ద߹ੑ͕ߴ͍ʯ

    • ࠶ݱ཰:ʮݕࡧ͞Εͨద߹จॻͷ਺ ÷ શର৅จॻதͷਖ਼ ղจॻͷ਺ʯ • ࠶ݱ཰͕ߴ͍ͱʮద߹ੑ͸ͱ΋͔͘औΓ͜΅͠͸ͳ͍ʯ
  9. ద߹཰ͱ࠶ݱ཰ͷࢉग़ • ԿΛ࣋ͬͯʮద߹ʯͱ͢Δ͔͸Ϣʔβʔͷ಄ͷதʹ ͷΈ͋Δ • ≒ ಉ͡ݕࡧΩʔϫʔυͰ΋Ϣʔβʔ͝ͱʹٻΊΔ ΋ͷ͸ҟͳΔՄೳੑ͕͋Δ • ࣮ࡍͷαʔϏεͰ͸௚઀ଌఆ͢Δ͜ͱ͸ෆՄೳ

    • ⇢ϢʔβʔͷߦಈΛ෼ੳͯ͠ධՁ͢Δඞཁ͕͋Δ
  10. ద߹཰ͱ࠶ݱ཰Ͱॏࢹ͢Δͷ͸ʁ • Ұൠʹద߹཰ͱ࠶ݱ཰͸τϨʔυΦϑͷؔ܎͕͋ Δͱ͍ΘΕΔ • ͲͪΒ͕ॏཁ͔͸αʔϏεͷੑ࣭ʹΑΔ • KibelaͷΑ͏ͳاۀ಺ͷจॻݕࡧͰ͸ʮऔΓ͜΅ ͠ ≒

    όάʯͱೝࣝ͞ΕΔ • ͭ·Γ࠶ݱ཰͸ʮ࠷௿ݶकΔ΂͖඼࣭ʯͰ͋Δ
  11. ElasticsearchʹΑΔશจݕࡧ ʹ͓͚ΔݕࡧείΞͷߟ͑ํ

  12. Elasticsearchͱ͸ • શจݕࡧΤϯδϯ • SQLͷLIKEݕࡧͱͷҧ͍: • ܗଶૉղੳޙͷ୯ޠͰݕࡧͰ͖Δ • ਖ਼نԽ͞Εͨ୯ޠͰݕࡧͰ͖Δ •

    ෳࡶͳείΞʹجͮ͘ιʔτ͕Ͱ͖Δ
  13. Elasicsearch༻ޠ RDBMS Table Record Column Elasticsearch Index Document Field ※

    Elasticsearch v5·Ͱ͸ table = type ͱઆ໌͞Ε͖͕ͯͨ v6 Ͱtype͸ඇ঑ྭɺ v7 Ͱ࡟আ͞ΕΔͷͰ஫ҙ
  14. ܗଶૉղੳ

  15. ܗଶૉղੳͯ͠ݕࡧ • શจݕࡧͷߴ଎ԽͷͨΊʹసஔΠϯσΫεͳͲͷ ΞϧΰϦζϜΛ࢖͍͍ͨ • సஔΠϯσΫεͷͨΊʹೖྗ͞ΕΔจষΛద౰ͳ ୯ҐͰ෼ׂ͢Δඞཁ͕͋Δ • ೔ຊޠͷΑ͏ʹ୯ޠͷ۠੾Γ͕͸͖ͬΓ͠ͳ͍ݴ ޠͷ৔߹N

    Gram and/or ܗଶૉղੳͰ෼ׂ͢Δ
  16. N Gram • N͸௨ৗ2͔3 • 2 gram ͷ৔߹ɺʮ͜Μʹͪ͸ʯΛ • [“͜Μ”,

    “Μʹ”, “ʹͪ”, “ͪ͸”] ʹ෼͚Δ
  17. ܗଶૉղੳ • ʮ౦ژ౎ʹҾͬӽͨ͠ʯΛ • [“౦ژ౎”, “ʹ”, “Ҿͬӽ͠”, “ͨ”] ͳͲʹ෼ׂ ͢Δ

    • ඼ࢺʢ໊ࢺ, ܗ༰ࢺʣ৘ใ͕ར༻Ͱ͖ΔͷͰɺ ޙͷਖ਼نԽͰͦͷ৘ใΛར༻
  18. LIKEݕࡧͱͷࠩ: ܗଶૉղੳฤ • “౦ژ౎ʹҾͬӽͨ͠” LIKE “%ژ౎%” • Ϛον͢Δ • [“౦ژ౎”,

    “ʹ”, “Ҿͬӽ͠”, “ͨ”].include?(“ژ ౎”) • Ϛον͠ͳ͍
  19. ܗଶૉղੳͱN Gramͷࠩ • ͨͱ͑͹ʮژ౎ʯͰʮ౦ژ౎ʯΛؚΉจॻΛ… • ܗଶૉղੳϕʔεͩͱݕࡧͰ͖ͳ͍ • ͭ·Γద߹཰ͷ໘Ͱ༏Ε͍ͯΔ • N

    GramϕʔεͩͱݕࡧͰ͖Δ • ͭ·Γ࠶ݱ཰ͷ໘Ͱ༏Ε͍ͯΔ
  20. ਖ਼نԽ

  21. ͳͥਖ਼نԽ͕ඞཁ͔ • ܗଶૉղੳʴసஔΠϯσΫεʹΑΔݕࡧͷ໛ࣜ Խ: [“Ҿͬӽ͠”, “ͨ”].include?(“Ҿͬӽ͠”) • “Ҿӽ”, “Ҿӽ͠” ΋ಉ༷ʹݕࡧ͍ͨ͠

    ⇢ ਖ਼نԽ
  22. ܗଶૉղੳͱਖ਼نԽ • ܗଶૉղੳث͕ࣙॻͱ඼ࢺ৘ใΛ࢖ͬͯਖ਼نԽ͢Δ • Elasticsearchͷ৔߹kuromoji plugin͕೔ຊޠͷܗଶૉղੳ ͱਖ਼نԽΛαϙʔτ • kuromoji_baseform: “ҿΈ”

    ⇢ “ҿΉ” • kuromoji_stemmer: “αʔόʔ” ⇢ “αʔό” • kuromoji_number: “ඦԁ” ⇢ “100ԁ”
  23. είΞϦϯά

  24. ݕࡧॱͷॏཁੑ • ͨͱ͑͹ɿʰژ౎ʱͰʰ౦ژ౎ʱͱ͍͏จॻ ͸ώοτͯ͠΄͍͕͠ɺʰژ౎ʱͰώοτ͢ Δจॻ͕͕͋ΔͳΒͦͪΒΛ্Ґʹ͍࣋ͬͯ ͖͍ͨ • ͭ·Γߴ͍࠶ݱ཰Λҡ࣋ͭͭ͠ݕࡧ݁Ռͷ্ Ґ͸ʮΑΓద߹͢ΔͱࢥΘΕΔʯจॻʹͨ͠ ͍

  25. ୯ޠ෼ׂ๏ʹΑΔॏΈ෇͚ • ܗଶૉղੳͰ෼ׂ͢Δͱద߹཰͸ߴ͘ͳΓ͕ ͕ͪͩ࠶ݱ཰͸௿͘ͳΓ͕ͪ • N GramͰ෼ׂ͢Δͱ࠶ݱ཰͸ߴ͘ͳΓ͕ͪͩ ͕ద߹཰͸௿͘ͳΓ͕ͪ • ⇢είΞϦϯάͷࡍʹॏΈ෇͚Λ͢Ε͹Α͍

  26. ElasticsearchͰͷ࣮૷ํ๏ • elasticsearch-model Ͱͷσʔλιʔεఆٛ UJUMF͸LVSPNPKJͰ ෼ׂ͢Δ UJUMF@OHSBN͸/ (SBNͰ෼ׂ͢Δ

  27. ϑΟʔϧυ͝ͱͷॏΈ෇͚ • ElasticsearchͰ͸ϑΟʔϧυ͝ͱʹॏΈ෇͚ ΛઃఆͰ͖Δ

  28. ͦͷଞͷείΞϦϯάख๏ • Phrase Match / ϑϨʔζϚον • Field Value Factor

    / ϑΟʔϧυ܎਺ • Decay / είΞͷݮਰ
  29. Phrase Match • Twitterݕࡧ΍GoogleݕࡧͰμϒϧΫΥʔτͰғΜͩͱ͖ʹ ʮϑϨʔζͦͷ΋ͷʯ͕ݕࡧର৅ʹͳΔͷ͕Phrase Match • Kibelaͷ৔߹ɺϑϨʔζʹϚονͨ͠ΒείΞΛϒʔετ ͍ͯ͠Δ •

    ྫ:ʮঁਆసੜʯͰݕࡧ͢ΔͱʮਅɾঁਆసੜIII NOCTURNEʯͷ΄͏͕ʮҟੈքʹঁਆͱͯ͠సੜ͠ ͨʯΑΓ΋είΞ͕ߴ͘ͳΔ
  30. Field Value Factor • ಛఆͷϑΟʔϧυͷ஋ͰείΞΛϒʔετͤ͞ Δػೳ • Kibelaͷ৔߹ɺϥΠΫ਺ͱτϥοΫόοΫ਺Λ Field Value

    Factorͱͯ͠൓ө͍ͤͯ͞Δ • ͭ·ΓʮΑ͘ϥΠΫ͞ΕΔจॻʯʮΑ͘Ϧ ϯΫ͞ΕΔจॻʯͷείΞ͕ߴ͍
  31. Decay • Field Value FactorͷٯͰɺಛఆϑΟʔϧυ஋ ͰείΞΛݮਰͤ͞Δػೳ • KibelaͰ͸ɺจॻͷλΠϜελϯϓΛར༻͠ ͕ͯ࣌ؒܦͭ΄ͲʹείΞ͕ݮਰ͢ΔΑ͏ʹ ͍ͯ͠Δ

  32. DecayͷΠϝʔδ • origin = now / timestamp͸աڈͷҰ఺ͱ͢Δ

  33. ·ͱΊ • શจݕࡧͷ඼࣭͸ʮద߹཰ʯʮ࠶ݱ཰ʯʮε ίΞϦϯάʯͰߟ͑Δ • ʮద߹཰ʯͱʮ࠶ݱ཰ʯ͸୯ޠ෼ׂ๏ʹΑͬ ͯվળͰ͖Δ • ʮείΞϦϯάʯ͸༷ʑͳཁૉ͕͋ΔͷͰશ จݕࡧΤϯδϯͷυΩϡϝϯτΛख़ಡ͢Δ