minne での検索改善の歴史を紹介
- 構成のお話 - solr から Elasticsearch 移行前後 - Elasticsearch 移行後の構成変更 - 検索について - 計測のはなし - A/B テストの話 - suggester の話 - 辞書管理の話
ޙ౻རത(.01FQBCP *ODୈճ&MBTUJDTFBSDIษڧձʮݕࡧฤʯNJOOFͰͷݕࡧվળͷྺ࢙
View Slide
νʔϑςΫχΧϧϦʔυ5PTIJIJSP([email protected]NJOOFࣄۀ෦!(.0ϖύϘ
·ͣNJOOFͷհ
NJOOF
NJOOFͷհwࠃ࠷େͷϋϯυϝΠυϚʔέοτwѻ͏ΧςΰϦʔΞΫηαϦʔ͔ΒՈ۩৯·Ͱ༷ʑwαʔϏε։࢝wࠓ݄ ʹΞϓϦ%-ສಥഁwੈా୩ਆށԬʹͯNJOOFͷΞτϦΤͱݺΕΔ࡞ՈࢧԉεϖʔεΛӡӦwϦΞϧΠϕϯτଟ։࠵
ϦΞϧΠϕϯτͷ༷ࢠ
ࠓͷ༰wߏͷ͓wTPMS͔Β&MBTUJDTFBSDIҠߦલޙw&MBTUJDTFBSDIҠߦޙͷߏมߋwݕࡧʹ͍ͭͯwܭଌͷͳ͠w"#ςετͷwTVHHFTUFSͷwࣙॻཧͷ
·ͣߏͷ
˞࡞σʔλ͕ߋ৽͞Εͨࡍͷॲཧͷ؆қਤҎ߱·Ͱ
wݕࡧΤϯδϯ4PMSwσʔλͷөఆظCBUDIw࡞ͷݕࡧͷΈ͕ଘࡏwݕࡧΤϯδϯ&MBTUJDTFBSDIwσʔλͷөߋ৽࣌ʹඇಉظॲཧwҠߦ࣌࡞ݕࡧͷΈ͕ͩଓʑ૿͑Δ·Ͱ Ҏ߱
σʔλөͷҧ͍ݕࡧΤϯδϯͷҧ͍Ͱͳ͘ҠߦλΠϛϯάͰྑ͖ΞʔΩςΫνϟΛબ͚ͨͩ͠
NJOOFY&MBTUJDTFSDIͷྺ࢙
NJOOFY&MBTUJDTFBSDIୈظwͷ4PMS͔ΒҠߦͨ͠ࡍ'PVOE ݱ&MBTUJD$MPVEΛ༻wࣾͰӡ༻ͷϊϋͳ͔ͬͨwͱΓ͋͑ͣҠߦεϐʔυΛ༏ઌ͔ͨͬͨ͠w༻͍ͯ͘͠͏ͪʹ͕ൃੜͨ͠wεέʔϧΞοϓ͕େมwࣙॻ͕͑ͳ͍ ಋೖॳ͔ΒΘ͔͍ͬͯͨwQMVHJOͷՃ ಋೖॳ͔ΒΘ͔͍ͬͯͨ
࣌'PVOEͰʹͳ͍ͬͯͨ͜ͱ &MBTUJD$MPVEͰղফ͞Ε͍ͯΔͣʂʁ
NJOOFY&MBTUJDTFBSDIୈظw"84&$ʹࣗલͰΫϥελΛߏஙwͳͥ"NB[PO&MBTUJDTFBSDI4FSWJDFΛબ͠ͳ͔ͬͨʁw࣌&MBTUJDTFBSDIͷWFSTJPO͕ݹ͔ͬͨ ࠷৽͕࣌ʹwࣙॻΛ͑ͳ͍ղܾ͠ͳ͔ͬͨwݱࡏͷ&MBTUJDTFBSDIͷWFSTJPOY
͜͜·Ͱͷ·ͱΊ
͜͜·Ͱͷ·ͱΊwNJOOF4PMS͔Β&MBTUJDTFBSDIʹҠߦ͠·ͨ͠wॳظ&MBTUJD$MPVEwޙʹ"84&$ʹΫϥελΛߏஙw&MBTUJDTFBSDIΛબΜͩཧ༝
͔͜͜Βݕࡧͷ
ݕࡧ݁Ռͷྑ͠ѱ͠ͱ
ݕࡧ݁Ռͷྑ͠ѱ͠w࠶ݱ ద߹͔Βܭࢉ͢Δ͜ͱՄೳwຊʹϢʔβ͕ٻΊΔݕࡧ͔ʁදࣔ͢Δॱ൪Өڹ͢ΔwͳΜͱͳ͘ྑͦ͞͏Ͱݕࡧ݁ՌΛ͍͍ͬͯ͘͡ͱw࣮Ϣʔβ͔ΒݟͨΒΰϛΈ͍ͨͳݕࡧ݁Ռʹ͍ͯ͠ΔՄೳੑwϢʔβ͕ٻΊ͍ͯͨͷ͕࠷ޙͷϖʔδʹ͋Γશ͘ݟ͔ͭΒͳ͍ͷ͕
Ϣʔβ͕ٻΊ͍ͯͨͷΛݟ͚ͭΒΕ͔ͨʁΛΔʹʁ
ܭଌ͢Δ͔͠ͳ͍
NJOOFͰߦಈϩάΛͬͯܭଌ
ϩάΛੵ͢Δਤ
͜͜ʹݟग़͕͠ೖΓ·͢wϢʔβͷߦಈϩάΛ5%ʹੵ͢ΔwߦಈϩάʹͲ͏͍͏݅Ͱݕࡧ͞Ε͔ͨʁͱ͍͏ใͳͲؚ·ΕΔwੵ͞ΕͨߦಈϩάΛूܭ͠$53ͷࢦඪΛSFEBTIͰݟ͑ΔԽwݕࡧ݁ՌΛม͑ͨ͜ͱʹΑͬͯ$53͕Ͳ͏มԽ͔ͨ͠ʁΛ͏
ܭଌ४උ͕Ͱ͖ͨͷͰ"#ςετ
ݕࡧ݁Ռͷ"#ςετwϢʔβΛ"#ʹྨwϥϯμϜͰৼΓ͚ͯDPPLJFʹใΛ৯ΘͤΔwϢʔβͷߦಈϩάʹ͕ࣗ"#ͲͪΒͳͷ͔ʁͱ͍͏ใΛ༩͢Δw"#ͦΕͧΕͷࢦඪΛݟ͑ΔԽ͠ͲͪΒ͕ྑ͍͔ʁΛൺֱ͢Δwࢦඪ͕ߴ͍ํΛ࠾༻࣍͠ͷ"#Λߦ͏w̋̋ԁҎ্ߪೖͰ̋̋ΩϟϯϖʔϯͳͲ͕͋Δͱࢦඪ͕ϒϨΔ͜ͱ͕͋ΔͷͰҙ͕ඞཁ
ݕࡧͷߦಈϩάΛੵ͢Δͱଞʹྑ͍͜ͱ͕
ϩάΛੵ͢Δ͜ͱͷϝϦοτwࡢͷϩάΛݟͯτϨϯυΛΔ͜ͱ͕Ͱ͖ΔwNJOOFͷΑ͏ͳૹʹ͕͔͔࣌ؒΔαʔϏεͩͱ࣮ࡍͷτϨϯυͱඍົʹͣΕ͍ͯͨΓ͢Δwޙड़ͷΦʔτίϯϓϦʔτར༻ՄೳwFUD
NJOOFͰͲΜͳ"#ςετΛ͍ͯ͠Δ ͍͔ͯͨ͠ʁ
'VODUJPO4DPSF2VFSZΛ͍είΞΛมߋwߪೖ͞Εͨճ͕ଟ͍w͓ؾʹೖΓͷ͕ଟ͍wಛఆͷ୯ޠ قઅతͳؚ͕·Ε͍ͯͨΒείΞΛ্ԼwϢʔβͷଐੑ͝ͱʹείΞΛมߋwΧςΰϦʔ͝ͱʹείΞ্͕ঢ͢Δ݅ΛมߋwFUD
GET /_search # likes ͷΛείΞʹө͢Δ{"query": {"function_score": {"field_value_factor": {"field": "likes","factor": 1.2,"modifier": "sqrt"}}}}
"#ςετ͏·͍͔͘ͳ͍͜ͱଟ͍
͏·͍͔͘ͳ͔ͬͨͱ͍͏͕ࣝੵ͞ΕΕྑ͍
$PNQMFUJPO4VHHFTUFSͷ͓
$PNQMFUJPO4VHHFTUFSͱʁw(PPHMFͰݕࡧ͢Δ࣌ʹ్த·Ͱೖྗ͢Δͱީิ͕ग़ͯ͘ΔΞϨ ΦʔτίϯϓϦʔτͱݺΕΔͷw&4·Ͱઐ༻ͷFOEQPJOU @TVHHFTU͕ଘࡏ͍ͯͨ͠w&4͔Β௨ৗͷݕࡧ @TFBSDIʹ4VHHFTUFS༻ͷΫΤϦΛ͛Δ
GET /_search{"suggest": {"minne-suggest": {"prefix": "minne","completion": {"field": "suggest","size": 10}}}}
TVHHFTUͱͯ͠ొ͢Δ୯ޠʹ͍ͭͯ
TVHHFTUͱͯ͠ొ͢Δ୯ޠʹ͍ͭͯwߦಈϩά͔ΒաڈOؒͷݕࡧ͞Εͨ୯ޠΛूܭ͢Δwूܭͨ͠୯ޠΛ$PNQMFUJPO4VHHFTUFS༻ͷ୯ޠͱͯ͠ొ͢ΔwݕࡧճΛج४ʹXFJHIUΛઃఆ͢Δ
ྨٛޠࣙॻཧͷ͓
ྨٛޠw"84ͱ"NB[PO8FC4FSWJDFTͷจࣈͱͯ͠ҧ͏͕ҙຯ͕ಉ͡ͷΛҰॹʹѻͬͯ͘ΕΔΑ͏ʹͳΔΞϨwྨٛޠΛࣗͰఆٛ͢Δ͜ͱ͕Մೳw4ZOPOZN5PLFO'JMUFSΛ͏
ྨٛޠϦετΛͲ͏࡞͔ͬͨwXJLJQFEJB͔Β࡞wݕࡧ͞Εͨ୯ޠͷ্Ґ/݅ΛோΊͯϦετʹՃw࠷ऴతʹਓྗͰϦετΛνΣοΫ
ྨٛޠϦετͷ՝
ྨٛޠϦετͷ՝wݱঢ়ਓྗͳͷͰେมwఆظతʹߋ৽͕Ͱ͖͍ͯΔΘ͚Ͱͳ͍w͋ΔఔࣗಈԽΛ͍ͨ͠wϋϯυϝΠυϚʔέοτͱ͍͏ಛੑ্ҰൠతͰͳ͍୯ޠ͕ଟଘࡏ
ࣙॻཧ
ࣙॻwܗଶૉղੳΛ௨ͨ͠ࡍʹఆ֎ͷ୯ޠʹׂ͞ΕΔ͜ͱ͕͋ΔwϋϯυϝΠυͱ͍͏୯ޠ͕ϋϯυͱϝΠυʹׂ͞ΕΔ ͋͘·Ͱྫw͜ͷΑ͏ͳΛղܾͯ͘͠ΕΔͷ͕ࣙॻ
ࣙॻΛͲ͏࡞͔ͬͨwաڈʹݕࡧ͞Εͨ୯ޠͷ্Ґ/݅Λऔಘwऔಘͨ͠୯ޠΛ&MBTUJDTFBSDIͷ"OBMZ[Fʹ͔͚Δw݁Ռͱͯ͠ෳͷτʔΫϯʹ͔Εͨ߹ɺࣙॻʹొͨ͠ํ͕ྑ͍͔͠Εͳ͍୯ޠͱݴ͑Δw্هͷϦετΛ࡞͋͠ͱਓ͕அ
GET /_analyze{"analyzer": "standard","text" : "this is a test"}
͏গָ͍ͨ͠͠
ਏ͍ͷͰࣗಈԽ
ࣙॻ࡞ࣗಈԽୈظwલʹݕࡧ͞Εͨ୯ޠΛूܭɺ্Ґ/݅Λऔಘwऔಘͨ͠୯ޠΛ"OBMZ[Fʹ͔͚Δw"OBMZ[Fʹ͔͚ͨ݁ՌෳͷτʔΫϯʹׂ͞Εͨ୯ޠΛTMBDLʹ௨w্هΛखಈͰࣙॻʹՃ͢ΔwࣙॻQVQQFUͷϦϙδτϦͰཧ͍ͯ͠Δw։ൃڥͳͲͰຊ൪ͱಉࣙ͡ॻ͕͑ΔΑ͏ʹͳΔ
ࣙॻ࡞ࣗಈԽୈظwલʹݕࡧ͞Εͨ୯ޠΛूܭɺ্Ґ/݅Λऔಘwऔಘͨ͠୯ޠΛ&MBTUJDTFBSDIͷ"OBMZ[Fʹ͔͚Δw݁Ռͱͯ͠ෳͷτʔΫϯʹ͔Εͨ߹ɺ%#ʹอଘwಡΈԾ໊ͳͲखಈͰཧը໘͔ΒొwCBUDIͰ%#͔ΒࣙॻΛ࡞͠&MBTUJDTFBSDIʹEFQMPZw্هCBUDIͰQVQQFUͷϦϙδτϦʹ1VMM3FRVFTUΛ࡞
ࣙॻʹొ͢Δจࣈͷ͜ͱ͚ͩߟ͑Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳͬͨ
ࠓճհͨ͠ࣄྫҎ֎Ͱ&MBTUJDTFBSDIΛͬͯ·͢
ͦͷଞͷࣄྫw࡞Ոʹఏڙ͍ͯ͠ΔΞΫηεղੳػೳw࡞ՈݕࡧwલͷͲͷΑ͏ͳ୯ޠͰݕࡧ͞Ε͔ͨʁΛूܭ͢Δ͜ͱʹΑͬͯτϨϯυΛΔwΫϦεϚε͚ͷ࡞͕લͲͷ͘Β͍ͷ࣌ظ͔Β୳͞Ε࢝Ί͔ͨͳͲwFUD
·ͱΊ
·ͱΊwݕࡧͷΈͰेͳػೳwϩάΛΈ߹ΘͤΔ͜ͱͰߋʹڧྗw"#ςετʹΑΓɺΑΓྑ͍ݕࡧ݁ՌΛࢦ͢w$PNQMFUJPO4VHHFTUFSΛ༻ͨ͠ΦʔτίϯϓϦʔτwྨࣅޠࣙॻཧେมw͋ΔఔࣗಈԽ͢Δ͜ͱग़དྷΔw͜͜Ͱϩά͕͍͖ͯ͘Δ
͋Γ͕ͱ͏͍͟͝·ͨ͠