OkCupidã®åºäŒãç³»ãµã€ãã®äžå¯æ¬ ãªéšåã¯ãæœåšçãªããŒãããŒã®æšèŠã§ãããããã¯ãããªããšããªãã®æœåšçãªããŒãããŒã瀺ããå€ãã®å¥œã¿ã®éè€ã«åºã¥ããŠããŸãããæ³åã®ãšããããã®ã¿ã¹ã¯ãæé©åããæ¹æ³ã¯ãããããããŸãã
ãã ããæœåšçãªããŒãããŒãšããŠããªããæšèŠããïŒãŸãã¯ä»ã®äººã®æœåšçãªããŒãããŒãšããŠããªãèªèº«ãæšèŠããïŒäººã«åœ±é¿ãäžããèŠå ã¯ãããªãã®å¥œã¿ã ãã§ã¯ãããŸãããã©ã³ã¯ä»ãããã«ãæ¡ä»¶ã«äžèŽãããã¹ãŠã®ãŠãŒã¶ãŒã衚瀺ããã ãã®å Žåããªã¹ãã¯ãŸã£ããæé©ã§ã¯ãããŸãããããšãã°ãæè¿ã®ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ãç¡èŠãããšããµã€ãã«ã¢ã¯ã»ã¹ããŠããªã人ãšã®äŒè©±ã«ããå€ãã®æéãè²»ããããšãã§ããŸããããªããæå®ãã奜ã¿ã«å ããŠãç§ãã¡ã¯ããªããèŠãã¹ãã ãšæã人ã ãããªãã«æšèŠããããã«å€ãã®ã¢ã«ãŽãªãºã ãšèŠå ã䜿çšããŸãã
å¯èœãªéãæé«ã®çµæãšãã»ãŒç¡éã®æšå¥šäºé ã®ãªã¹ããæäŸããå¿ èŠããããŸããã³ã³ãã³ãã®å€æŽé »åºŠãå°ãªãä»ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãæšå¥šäºé ãå®æçã«æŽæ°ããããšã§ãããè¡ãããšãã§ããŸããããšãã°ãSpotifyã®ãDiscoverWeeklyãæ©èœã䜿çšãããšãæšå¥šãã©ãã¯ã®ã»ããã楜ããããšãã§ããŸãããã®ã»ããã¯æ¥é±ãŸã§å€æŽãããŸããã OkCupidã§ã¯ããŠãŒã¶ãŒã¯èªåã®æšå¥šäºé ããªã¢ã«ã¿ã€ã ã§ééãªã衚瀺ããŸããæšå¥šããããã³ã³ãã³ããã¯æ¬è³ªçã«éåžžã«åçã§ãïŒããšãã°ããŠãŒã¶ãŒã¯èšå®ããããã¡ã€ã«ããŒã¿ãå Žæãå€æŽãããããã€ã§ãéã¢ã¯ãã£ãåãããã§ããŸãïŒããŠãŒã¶ãŒã¯èª°ãã©ã®ããã«æšèŠã§ããããå€æŽã§ãããããç¹å®ã®æéã«äžèŽããå¯èœæ§ã®ãããã®ãæé©ã§ããããšã確èªããããšæããŸãã
ããŸããŸãªã©ã³ã¯ä»ãã¢ã«ãŽãªãºã ãå©çšããŠãªã¢ã«ã¿ã€ã ã®æšå¥šãè¡ãã«ã¯ããŠãŒã¶ãŒããŒã¿ã§åžžã«æŽæ°ãããæœåšçãªåè£ããã£ã«ã¿ãªã³ã°ããŠã©ã³ã¯ä»ãããæ©èœãæäŸããæ€çŽ¢ãšã³ãžã³ã䜿çšããå¿ èŠããããŸãã
æ¢åã®äžèŽæ€çŽ¢ã·ã¹ãã ã®åé¡ã¯äœã§ãã
OkCupidã¯ãç¬èªã®å éšæ€çŽ¢ãšã³ãžã³ãäœå¹Žã䜿çšããŠããŸãã詳现ã«ã€ããŠã¯èª¬æããŸããããé«ã¬ãã«ã®æœè±¡åã§ã¯ããŠãŒã¶ãŒã¹ããŒã¹ã·ã£ãŒãäžã®map-reduceãã¬ãŒã ã¯ãŒã¯ã§ãããåã·ã£ãŒãã«ã¯é¢é£ãããŠãŒã¶ãŒããŒã¿ã®äžéšãã¡ã¢ãªã«å«ãŸããããŸããŸãªãã£ã«ã¿ãŒã䞊ã¹æ¿ãããªã³ã¶ãã©ã€ã§æå¹ã«ãããšãã«äœ¿çšãããŸããæ€çŽ¢èªã¯ãã¹ãŠã®ã·ã£ãŒãã§åå²ããæçµçã«çµæãçµã¿åããããŠäžäœkåã®åè£ãè¿ãããŸããç§ãã¡ãæžãããã®ãã¢ãªã³ã°ã·ã¹ãã ã¯ããŸãæ©èœããã®ã«ããªãä»ãããå€æŽããããšã«ããã®ã§ããïŒ
ä»åŸæ°å¹Žéã§ããŸããŸãªæšå¥šããŒã¹ã®ãããžã§ã¯ãããµããŒãããããã«ãã·ã¹ãã ãæŽæ°ããå¿ èŠãããããšã¯ããã£ãŠããŸãããç§ãã¡ã®ããŒã ãæé·ããããšã¯ããã£ãŠããŸãããããããžã§ã¯ãã®æ°ãå¢ããŸãããæ倧ã®èª²é¡ã®1ã€ã¯ãã¹ããŒãã®æŽæ°ã§ãããããšãã°ãæ°ãããŠãŒã¶ãŒããŒã¿ïŒèšå®ã®æ§å¥ã¿ã°ãªã©ïŒãè¿œå ããã«ã¯ããã³ãã¬ãŒãã«æ°çŸè¡ãŸãã¯æ°åè¡ã®ã³ãŒããå¿ èŠã§ãããå±éã«ã¯ãã·ã¹ãã ã®ãã¹ãŠã®éšåãæ£ããé åºã§å±éãããããã«æ³šææ·±ã調æŽããå¿ èŠããããŸãããã«ã¹ã¿ã ããŒã¿ã»ããããã£ã«ã¿ãªã³ã°ããããçµæãã©ã³ã¯ä»ããããããæ°ããæ¹æ³ãè¿œå ããããšãããšããšã³ãžãã¢ã®æéã¯åæ¥ããããŸããã圌ã¯ãåã»ã°ã¡ã³ããæåã§æ¬çªç°å¢ã«å±éããæœåšçãªåé¡ãç£èŠããå¿ èŠããããŸãããããã«éèŠãªããšã«ãã·ã¹ãã ã®ç®¡çãšæ¡åŒµãå°é£ã«ãªã£ãŠããŸããã·ã£ãŒããšã¬ããªã«ã¯ããœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãããŠããªããã·ã³ã®ããªãŒãå šäœã«æåã§é åžãããããã§ãã
2019幎ã®åãã«ããã¢ãªã³ã°ã·ã¹ãã ã®è² è·ãå¢å ãããããè€æ°ã®ãã·ã³ã«ãµãŒãã¹ã€ã³ã¹ã¿ã³ã¹ãæåã§é 眮ããŠãã¬ããªã«ã®å¥ã®ã»ãããè¿œå ããŸãããäœæ¥ã¯ããã¯ãšã³ããšéçºè ã®ããã«äœé±éãããããŸããããã®éãçµã¿èŸŒã¿ãµãŒãã¹ã®æ€åºãã¡ãã»ãŒãžãã¥ãŒã€ã³ã°ãªã©ã®ããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ãæ°ã¥ãå§ããŸããããããã®ã³ã³ããŒãã³ãã¯ä»¥åã¯æ£åžžã«æ©èœããŠããŸãããããããã®ã·ã¹ãã ã®ã¹ã±ãŒã©ããªãã£ã«çåãåããããã«ãªããŸãããç§ãã¡ã®ä»äºã¯ãã¯ãŒã¯ããŒãã®ã»ãšãã©ãã¯ã©ãŠãã«ç§»åããããšã§ããããã®ãã¢ãªã³ã°ã·ã¹ãã ã®ç§»æ€ã¯ãããèªäœãé¢åãªäœæ¥ã§ãããä»ã®ãµãã·ã¹ãã ãå«ãŸããŸãã
çŸåšãOkCupidã§ã¯ããããã®ãµãã·ã¹ãã ã®å€ããããå ç¢ã§ã¯ã©ãŠãã«é©ããOSSãªãã·ã§ã³ã«ãã£ãŠæäŸãããŠãããããŒã ã¯éå»2幎éã§å€§ããªæåãåããããŸããŸãªãã¯ãããžãŒãæ¡çšããŠããŸããããã§ã¯ãããã®ãããžã§ã¯ãã«ã€ããŠã¯èª¬æããŸãããã代ããã«ãäžèšã®åé¡ã«å¯ŸåŠããããã«è¡ã£ãæé ã«çŠç¹ãåœãŠãéçºè ã«ãšã£ãŠãã䜿ããããã¹ã±ãŒã©ãã«ãªæ€çŽ¢ãšã³ãžã³ã§ããVespaã«ç§»ããŸãã
ããã¯å¶ç¶ã§ãïŒOkCupidãVespaãšåéã«ãªã£ãçç±
æŽå²çã«ãç§ãã¡ã®ããŒã ã¯å°èŠæš¡ã§ãããæ€çŽ¢ãšã³ãžã³ã®éžæã¯éåžžã«é£ããããšãæåããç¥ã£ãŠããã®ã§ãç§ãã¡ã«åœ¹ç«ã€ãªãŒãã³ãœãŒã¹ã®ãªãã·ã§ã³ãæ€èšããŸããã2ã€ã®äž»èŠãªåè£ã¯ElasticsearchãšVespaã§ããã
Elasticsearch
ããã¯ã倧èŠæš¡ãªã³ãã¥ããã£ãåªããããã¥ã¡ã³ããããã³ãµããŒããåãã人æ°ã®ãããã¯ãããžãŒã§ããããããã®æ©èœããããTinderã§ã䜿çšãããŠããŸãã PUTãããã³ã°ã䜿çšããŠæ°ããã¹ããŒããã£ãŒã«ããè¿œå ã§ããæ§é åãããRESTåŒã³åºãã䜿çšããŠã¯ãšãªãäœæã§ããŸããã¯ãšãªæéã«ããã©ã³ã¯ä»ããã«ã¹ã¿ã ãã©ã°ã€ã³ãäœæããæ©èœãªã©ããµããŒããããŠããŸããã¹ã±ãŒãªã³ã°ãšã¡ã³ããã³ã¹ã«é¢ããŠã¯ãã·ã£ãŒãã®æ°ãå®çŸ©ããã ãã§æžã¿ãŸãã ãããã³ã·ã¹ãã èªäœãã¬ããªã«é åžãåŠçããŸããã¹ã±ãŒãªã³ã°ã«ã¯ãããå€ãã®ã·ã£ãŒãã䜿çšããŠå¥ã®ã€ã³ããã¯ã¹ãåæ§ç¯ããå¿ èŠããããŸãã
Elasticsearchãå»æ¢ããäž»ãªçç±ã®1ã€ã¯ãã¡ã¢ãªã«çã®éšåçãªæŽæ°ããªãããšã§ãããã€ã³ããã¯ã¹ãäœæããããšããŠããããã¥ã¡ã³ãã¯ãããããã¡ãã»ãŒãžãªã©ã®ããã«é »ç¹ã«æŽæ°ããå¿ èŠããããããããã¯ãŠãŒã¹ã±ãŒã¹ã«ãšã£ãŠéåžžã«éèŠã§ãããããã®ããã¥ã¡ã³ãã¯ãåºåãåçãã»ãšãã©ãäžå®ã®å±æ§ãæã€éçãªããžã§ã¯ãã§ãããããã£ãŠãæŽæ°æã®éå¹ççãªèªã¿åã/æžã蟌ã¿ãµã€ã¯ã«ã¯ãããã©ãŒãã³ã¹ã®å€§ããªåé¡ã§ããã
ãã¹ã
ãœãŒã¹ã³ãŒãã¯ã»ãã®æ°å¹Žåã«éãããŸãããéçºè ã¯ãããã°ããŒã¿ããªã¢ã«ã¿ã€ã ã§ä¿åãæ€çŽ¢ãã©ã³ã¯ä»ããæŽçããããã®ãµããŒããçºè¡šããŸãããVespaããµããŒãããæ©èœïŒ
ã¹ã±ãŒãªã³ã°ãšã¡ã³ããã³ã¹ã«é¢ããŠã¯ãã·ã£ãŒãã«ã€ããŠã¯ããèããŸãã ãã³ã³ãã³ãããŒãã®ã¬ã€ã¢ãŠããèšå®ãããšãVespaãããã¥ã¡ã³ãã®ã·ã£ãŒãã£ã³ã°ãããŒã¿ã®è€è£œãé åžã®æ¹æ³ãèªåçã«åŠçããŸããããã«ãããŒããè¿œå ãŸãã¯åé€ãããã³ã«ãããŒã¿ãèªåçã«åŸ©å ãããã¬ããªã«ããåé åžãããŸããã¹ã±ãŒãªã³ã°ãšã¯ãåã«æ§æãæŽæ°ããŠããŒããè¿œå ããããšãæå³ããVespaããã®ããŒã¿ããªã¢ã«ã¿ã€ã ã§èªåçã«åé åžã§ããããã«ããŸãã
å šäœãšããŠãVespaã¯ç§ãã¡ã®ãŠãŒã¹ã±ãŒã¹ã«æé©ã§ããããã«æãããŸããã OkCupidã«ã¯ããŠãŒã¶ãŒãæé©ãªãã®ãèŠã€ããã®ã«åœ¹ç«ã€ããŸããŸãªæ å ±ãå«ãŸããŠããŸãããã£ã«ã¿ãŒãšäžŠã¹æ¿ãã ãã§ã100ãè¶ ãããã©ã¡ãŒã¿ãŒããããŸããåžžã«ãã£ã«ã¿ãŒãšäžŠã¹æ¿ããè¿œå ããããããã®ã¯ãŒã¯ãããŒãç¶æããããšã¯éåžžã«éèŠã§ãããšã³ããªãšã¯ãšãªã®ç¹ã§ã¯ãVespaã¯æ¢åã®ã·ã¹ãã ã«æã䌌ãŠããŸããã€ãŸããç§ãã¡ã®ã·ã¹ãã ã§ã¯ãã¡ã¢ãªå ã®é«éãªéšåæŽæ°ã®åŠçãšãäžèŽèŠæ±äžã®ãªã¢ã«ã¿ã€ã åŠçãå¿ èŠã§ããã Vespaã¯ãã¯ããã«æè»ã§ã·ã³ãã«ãªã©ã³ãã³ã°æ§é ãåããŠããŸãã Elasticsearchã®ã¯ãšãªã®æ§é ãäžäŸ¿ã§ããã®ãšã¯å¯Ÿç §çã«ããã1ã€ã®åªããããŒãã¹ã¯YQLã§ã¯ãšãªãè¡šçŸã§ããããšã§ããã¹ã±ãŒãªã³ã°ãšã¡ã³ããã³ã¹ã®èŠ³ç¹ããããã®åŸãVespaã®èªåããŒã¿é ä¿¡æ©èœã¯ãæ¯èŒçå°èŠæš¡ãªããŒã ã«ãšã£ãŠéåžžã«é åçã§ããããšã蚌æãããŸãããå šäœãšããŠãVespaã¯ãElasticsearchãããä¿å®ã容æã§ãããšåæã«ããŠãŒã¹ã±ãŒã¹ãšããã©ãŒãã³ã¹èŠä»¶ãããé©åã«ãµããŒãããããšãããããŸããã
Elasticsearchã¯ããç¥ãããŠãããšã³ãžã³ã§ãããTinderã®çµéšããæ©æµãåããããšãã§ããŸãããã©ã®ãªãã·ã§ã³ã§ã倧éã®äºå調æ»ãå¿ èŠã«ãªããŸããåæã«ãVespaã¯ãZedgeãæ°ååã®ç»åãåããFlickrã1ç§ããã10äžåãè¶ ããã¯ãšãªãåããYahoo Gemini Adsåºåãã©ãããã©ãŒã ãªã©ãæ¬çªç°å¢ã§å€ãã®ã·ã¹ãã ã«ãµãŒãã¹ãæäŸããæé10å人ã®ã¢ã¯ãã£ããŠãŒã¶ãŒã«åºåãé ä¿¡ããŠããŸããããã«ãããããã¯æŠéã§ãã¹ããããå¹ççã§ä¿¡é Œæ§ã®é«ããªãã·ã§ã³ã§ãããšãã確信ãåŸãããŸãããå®éãVespaã¯Elasticsearchã®åããååšããŠããŸããã
ãŸããVespaã®éçºè ã¯éåžžã«çºä¿¡çã§åœ¹ç«ã€ããšã蚌æãããŠããŸããVespaã¯ããšããšåºåãšã³ã³ãã³ãã®ããã«å»ºãŠãããŸãããç§ãã¡ã®ç¥ãéããããã¯ãŸã åºäŒãç³»ãµã€ãã§äœ¿çšãããŠããŸãããç¬èªã®ãŠãŒã¹ã±ãŒã¹ããã£ããããæåã¯ãšã³ãžã³ãçµ±åããã®ã¯å°é£ã§ããããVespaããŒã ã¯éåžžã«å¿çæ§ãé«ããã·ã¹ãã ãè¿ éã«æé©åããŠãçºçããããã€ãã®åé¡ã«å¯ŸåŠã§ããããã«ããŸããã
Vespaã®ä»çµã¿ãšOkCupidã§ã®æ€çŽ¢ã®æ§å
Vespaã®äŸã«é£ã³èŸŒãåã«ããã®ä»çµã¿ã®æŠèŠãç°¡åã«èª¬æããŸãã Vespaã¯å€æ°ã®ãµãŒãã¹ã®ã³ã¬ã¯ã·ã§ã³ã§ãããåDockerã³ã³ããã¯ãadmin / configãã¹ããã¹ããŒãã¬ã¹Javaã³ã³ãããã¹ããããã³/ãŸãã¯ã¹ããŒããã«C ++ã³ã³ãã³ããã¹ããšããŠæ§æã§ããŸãããã®ä»ã®æ§æãéšåãMLã¢ãã«ãšã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžãçµç±ããŠå±éããããšãã§ããŠããç¶æ ã®APIã³ã³ããããã³ã³ã³ãã³ãã¯ã©ã¹ã¿ãžã®å€æŽã®é©çšãåŠçããæ§æã¯ã©ã¹ã¿å ããã£ãŒãèŠæ±ããã³ãã®ä»ã®èŠæ±ã¯ããã£ãŒãã®æŽæ°ãã³ã³ãã³ãã¯ã©ã¹ã¿ãŒã«å°çããåããŸãã¯åæ£èŠæ±ã®å®è¡ãçºçããã³ã³ãã³ãã¬ã€ã€ãŒã«èŠæ±ããã©ãŒã¯ãããåã«ãHTTPãä»ããŠã¹ããŒãã¬ã¹Javaã³ã³ãããŒïŒåŠçã®ã«ã¹ã¿ãã€ãºãå¯èœã«ããïŒãééããŸããã»ãšãã©ã®å Žåãæ°ããã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžã®å±éã«ã¯æ°ç§ããããããŸããããŸããVespaã¯ãããã®å€æŽãã³ã³ãããšã³ã³ãã³ãã¯ã©ã¹ã¿ã§ãªã¢ã«ã¿ã€ã ã«åŠçãããããäœãåèµ·åããå¿ èŠã¯ã»ãšãã©ãããŸããã
æ€çŽ¢ã¯ã©ã®ããã«èŠããŸããïŒ
Vespaã¯ã©ã¹ã¿ãŒããã¥ã¡ã³ãã«ã¯ãããŸããŸãªãŠãŒã¶ãŒåºæã®å±æ§ãå«ãŸããŠããŸããã¹ããŒãå®çŸ©ã¯ãããã¥ã¡ã³ãã¿ã€ããã£ãŒã«ããšãé©çšå¯èœãªã©ã³ãã³ã°åŒã®ã»ãããå«ãã©ã³ãã³ã°ãããã¡ã€ã«ãå®çŸ©ããŸãã次ã®ãããªãŠãŒã¶ãŒãè¡šãã¹ããŒãå®çŸ©ããããšããŸãã
search user {
document user {
field userId type long {
indexing: summary | attribute
attribute: fast-search
rank: filter
}
field latLong type position {
indexing: attribute
}
# UNIX timestamp
field lastOnline type long {
indexing: attribute
attribute: fast-search
}
# Contains the users that this user document has liked
# and the corresponding weights are UNIX timestamps when that like happened
field likedUserSet type weightedset<long> {
indexing: attribute
attribute: fast-search
}
}
rank-profile myRankProfile inherits default {
rank-properties {
query(lastOnlineWeight): 0
query(incomingLikeWeight): 0
}
function lastOnlineScore() {
expression: query(lastOnlineWeight) * freshness(lastOnline)
}
function incomingLikeTimestamp() {
expression: rawScore(likedUserSet)
}
function hasLikedMe() {
expression: if (incomingLikeTimestamp > 0, 1, 0)
}
function incomingLikeScore() {
expression: query(incomingLikeWeight) * hasLikedMe
}
first-phase {
expression {
lastOnlineScore + incomingLikeScore
}
}
summary-features {
lastOnlineScore incomingLikeScore
}
}
}
ãã®è¡šèš
indexing: attribute
ã¯ããããã®ãã£ãŒã«ãã®èªã¿åãããã³æžã蟌ã¿ããã©ãŒãã³ã¹ãæé«ã«ããããã«ããããã®ãã£ãŒã«ããã¡ã¢ãªã«æ ŒçŽããå¿
èŠãããããšã瀺ããŠããŸãã
ãããã®ã«ã¹ã¿ã ããã¥ã¡ã³ããã¯ã©ã¹ã¿ãŒã«å ¥åãããšããŸãããã次ã«ãäžèšã®ãã£ãŒã«ãã®ããããã§ãã£ã«ã¿ãªã³ã°ããŠã©ã³ã¯ä»ãã§ããŸããããšãã°ãããã©ã«ãã®æ€çŽ¢ãšã³ãžã³
http://localhost:8080/search/
ã«POSTãªã¯ãšã¹ããéä¿¡ããŠ777
ãçŸåšå°ãã50ãã€ã«ä»¥å
ã§ãã¿ã€ã ã¹ã¿ã³ã以éãªã³ã©ã€ã³ã§ã1592486978
æåŸã®ã¢ã¯ãã£ããã£ã§ã©ã³ã¯ä»ããããäžäœ2ã€ã®åè£ãç¶æããŠããèªåã®ãŠãŒã¶ãŒä»¥å€ã®ãŠãŒã¶ãŒãæ€çŽ¢ããŸãããŸããsummaryfeaturesãéžæããŠãã©ã³ãã³ã°ãããã¡ã€ã«ã®åã©ã³ãã³ã°åŒã®å¯äžã確èªããŸãããã
{
"yql": "select userId, summaryfeatures from user where lastOnline > 1592486978 and !(userId contains \"777\") limit 2;",
"ranking": {
"profile": "myRankProfile",
"features": {
"query(lastOnlineWeight)": "50"
}
},
"pos": {
"radius": "50mi",
"ll": "N40o44'22;W74o0'2",
"attribute": "latLong"
},
"presentation": {
"summary": "default"
}
}
次ã®ãããªçµæãåŸãããŸãã
{
"root": {
"id": "toplevel",
"relevance": 1.0,
"fields": {
"totalCount": 317
},
"coverage": {
"coverage": 100,
"documents": 958,
"full": true,
"nodes": 1,
"results": 1,
"resultsFull": 1
},
"children": [
{
"id": "index:user/0/bde9bd654f1d5ae17fd9abc3",
"relevance": 48.99315843621399,
"source": "user",
"fields": {
"userId": -5800469520557156329,
"summaryfeatures": {
"rankingExpression(incomingLikeScore)": 0.0,
"rankingExpression(lastOnlineScore)": 48.99315843621399,
"vespa.summaryFeatures.cached": 0.0
}
}
},
{
"id": "index:user/0/e8aa37df0832905c3fa1dbbd",
"relevance": 48.99041280864198,
"source": "user",
"fields": {
"userId": 6888497210242094612,
"summaryfeatures": {
"rankingExpression(incomingLikeScore)": 0.0,
"rankingExpression(lastOnlineScore)": 48.99041280864198,
"vespa.summaryFeatures.cached": 0.0
}
}
}
]
}
}
çµæã®ã©ã³ã¯ä»ããç §åããŠãã£ã«ã¿ãªã³ã°ããåŸãçµæãã©ã³ã¯ä»ãããããã®ç¬¬1ãã§ãŒãºïŒç¬¬1ãã§ãŒãºïŒã®èšç®ãããåŒãè¿ãããé¢é£æ§ïŒrelevanceïŒã¯ãã¯ãšãªã§æå®ããã©ã³ãã³ã°ãããã¡ã€ã«ïŒrank-profileïŒã®æåã®ãã§ãŒãºã®ãã¹ãŠã®ã©ã³ãã³ã°æ©èœãå®è¡ããçµæãšããŠã®å šäœçãªã¹ã³ã¢ã§ã
ranking.profile
myRankProfile
ããªã¹ãã«50ranking.features
ãå®çŸ©ããŸãquery(lastOnlineWeight)
ãããã¯ã䜿çšããå¯äžã®ã©ã³ãã³ã°åŒã«ãã£ãŠåç
§ãããŸãlastOnlineScore
ãå±æ§ã®ã¿ã€ã ã¹ã¿ã³ããçŸåšã®ã¿ã€ã ã¹ã¿ã³ããšæ¯èŒããŠæè¿ã®ãã®ã§ããå Žåã1ã«è¿ãæ°å€ã§ããçµã¿èŸŒã¿ã®ã©ã³ãã³ã°é¢æ° freshness
ã䜿çšããŸãããã¹ãŠãé 調ã«é²ãã§ããéããããã§è€éãªããšã¯äœããããŸããã
éçã³ã³ãã³ããšã¯ç°ãªãããã®ã³ã³ãã³ãã¯ããŠãŒã¶ãŒã«è¡šç€ºããããã©ããã«åœ±é¿ãäžããå¯èœæ§ããããŸããããšãã°ã圌ãã¯ããªãã奜ããããããŸããïŒå¥œããªãŠãŒã¶ãŒã®IDãããŒãšããŠããããçºçãããšãã®ã¿ã€ã ã¹ã¿ã³ããå€ãšããŠå«ããåãŠãŒã¶ãŒããã¥ã¡ã³ãã®å éãã£ãŒã«ãã« ã€ã³ããã¯ã¹ãä»ããããšãã§ããŸã
likedUserSet
ã次ã«ãããªãã奜ããªäººãé€å€ããã®ã¯ç°¡åã§ãïŒããšãã°ãlikedUserSet contains \â777\â
YQLã«åŒãè¿œå ããïŒããã©ã³ã¯ä»ãäžã«ãã®æ
å ±ãå«ããã«ã¯ã©ãããã°ããã§ããïŒçµæã§ç§ãã¡ã®äººã奜ããªãŠãŒã¶ãŒã®togrãå¢ããæ¹æ³ã¯ïŒ
以åã®çµæã§ã¯
incomingLikeScore
ããããã®ãããã®äž¡æ¹ã§ã©ã³ãã³ã°åŒã¯0ã§ããããŠãŒã¶ãŒã¯6888497210242094612
å®éã«ãŠãŒã¶ãŒãæ°ã«å
¥ããŸãã777
ããããç§ãã¡ãå
¥ãããšããŠããçŸåšã©ã³ãã³ã°ã§ã¯å©çšã§ããŸãã"query(incomingLikeWeight)": 50
ãæã
ã¯äœ¿çšããããšãã§ããŸãã©ã³ã¯æ©èœãYQLïŒç¬¬1ããã³æ©èœãžã®å¯äžã®æåã®åŒæ°ã¯rank()
ææžãäžèŽããŠãããã©ãããå€æããŸããããã¹ãŠã®åŒæ°ã¯ãã©ã³ãã³ã°ã¹ã³ã¢ãèšç®ããããã«äœ¿çšãããŠããïŒããã®åŸã䜿çšãããç©ãããã®å Žåã«ã¯ïŒåºèãžã®ç§ãã¡ã®YQLé äœåŒã®äžã§ãçã®ã¹ã³ã¢ãååŸããŸããŠãŒã¶ãŒãç§ãã¡ãæ°ã«å
¥ã£ããšãã®ã¿ã€ã ã¹ã¿ã³ãïŒãããšãã°ã次ã®ããã«ïŒ
{
"yql": "select userId,summaryfeatures from user where !(userId contains \"777\") and rank(lastOnline > 1592486978, dotProduct(likedUserSet, {\"777\":1})) limit 2;",
"ranking": {
"profile": "myRankProfile",
"features": {
"query(lastOnlineWeight)": "50",
"query(incomingLikeWeight)": "50"
}
},
"pos": {
"radius": "50mi",
"ll": "N40o44'22;W74o0'2",
"attribute": "latLong"
},
"presentation": {
"summary": "default"
}
}
{
"root": {
"id": "toplevel",
"relevance": 1.0,
"fields": {
"totalCount": 317
},
"coverage": {
"coverage": 100,
"documents": 958,
"full": true,
"nodes": 1,
"results": 1,
"resultsFull": 1
},
"children": [
{
"id": "index:user/0/e8aa37df0832905c3fa1dbbd",
"relevance": 98.97595807613169,
"source": "user",
"fields": {
"userId": 6888497210242094612,
"summaryfeatures": {
"rankingExpression(incomingLikeScore)": 50.0,
"rankingExpression(lastOnlineScore)": 48.97595807613169,
"vespa.summaryFeatures.cached": 0.0
}
}
},
{
"id": "index:user/0/bde9bd654f1d5ae17fd9abc3",
"relevance": 48.9787037037037,
"source": "user",
"fields": {
"userId": -5800469520557156329,
"summaryfeatures": {
"rankingExpression(incomingLikeScore)": 0.0,
"rankingExpression(lastOnlineScore)": 48.9787037037037,
"vespa.summaryFeatures.cached": 0.0
}
}
}
]
}
}
68888497210242094612
圌ã¯ç§ãã¡ã®ãŠãŒã¶ãŒã奜ãã§ãããincomingLikeScore
ã¯å®å
šãªæå³ãæã£ãŠããã®ã§ã
ä»ããŠãŒã¶ãŒã¯ãããã«åŒãäžããããŸãããã¡ãããããè€éãªè¡šçŸã§äœ¿çšã§ããããã«ãå®éã«ã¯åœŒãç§ãã¡ãæ°ã«å
¥ã£ããšãã®ã¿ã€ã ã¹ã¿ã³ãããããŸãããä»ã®ãšããã¯åçŽãªãŸãŸã«ããŠãããŸãã
ããã¯ãã©ã³ãã³ã°ã·ã¹ãã ã䜿çšããŠçµæããã£ã«ã¿ãªã³ã°ããã³ã©ã³ãã³ã°ããã¡ã«ããºã ã瀺ããŠããŸããã©ã³ãã³ã°ãã¬ãŒã ã¯ãŒã¯ã¯ãã¯ãšãªäžã«äžèŽããåŒïŒã»ãšãã©ã¯æ°åŠçãªãã®ïŒãé©çšããæè»ãªæ¹æ³ãæäŸããŸãã
Javaã§ããã«ãŠã§ã¢ãèšå®ãã
å¥ã®ã«ãŒãã䜿çšããŠããã®dotProductåŒãæé»çã«ãã¹ãŠã®ãªã¯ãšã¹ãã®äžéšã«ãããå Žåã¯ã©ããªããŸããïŒãããã«ã¹ã¿ã Javaã³ã³ããã¬ã€ã€ãŒã®åºçªã§ããã«ã¹ã¿ã ãµãŒãã£ãŒã³ã³ããŒãã³ããäœæã§ããŸããããã«ãããä»»æã®ãã©ã¡ãŒã¿ãŒãåŠçããã¯ãšãªãæžãçŽããŠãç¹å®ã®æ¹æ³ã§çµæãåŠçã§ããŸããKotlinã®äŸã次ã«ç€ºããŸãã
@After(PhaseNames.TRANSFORMED_QUERY)
class MatchSearcher : Searcher() {
companion object {
// HTTP query parameter
val USERID_QUERY_PARAM = "userid"
val ATTRIBUTE_FIELD_LIKED_USER_SET = âlikedUserSetâ
}
override fun search(query: Query, execution: Execution): Result {
val userId = query.properties().getString(USERID_QUERY_PARAM)?.toLong()
// Add the dotProduct clause
If (userId != null) {
val rankItem = query.model.queryTree.getRankItem()
val likedUserSetClause = DotProductItem(ATTRIBUTE_FIELD_LIKED_USER_SET)
likedUserSetClause.addToken(userId, 1)
rankItem.addItem(likedUserSetClause)
}
// Execute the query
query.trace("YQL after is: ${query.yqlRepresentation()}", 2)
return execution.search(query)
}
}
次ã«ãservices.xmlãã¡ã€ã«ã§ããã®ã³ã³ããŒãã³ãã次ã®ããã«æ§æã§ããŸãã
...
<search>
<chain id="default" inherits="vespa">
<searcher id="com.okcupid.match.MatchSearcher" bundle="match-searcher"/>
</chain>
</search>
<handler id="default" bundle="match-searcher">
<binding>http://*:8080/match</binding>
</handler>
...
次ã«ãã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžãäœæããŠãããã€ããã«ã¹ã¿ã ãã³ãã©ãŒã«ãªã¯ãšã¹ããéä¿¡ããŸã
http://localhost:8080/match-?userid=777
ã
{
"yql": "select userId,summaryfeatures from user where !(userId contains \"777\") and rank(lastOnline > 1592486978) limit 2;",
"ranking": {
"profile": "myRankProfile",
"features": {
"query(lastOnlineWeight)": "50",
"query(incomingLikeWeight)": "50"
}
},
"pos": {
"radius": "50mi",
"ll": "N40o44'22;W74o0'2",
"attribute": "latLong"
},
"presentation": {
"summary": "default"
}
}
以åãšåãçµæãåŸãããŸãïŒKotlinã³ãŒãã§ã¯ãå€æŽåŸã«YQLãã¥ãŒãåºåããããã®ãã¬ãŒã¹ããã¯ãè¿œå ãããã
tracelevel=2
ãURLãã©ã¡ãŒã¿ãŒã§èšå®ãããšãå¿çã衚瀺ãããããšã«æ³šæããŠãã ããã
...
{
"message": "YQL after is: select userId, summaryfeatures from user where ((rank(lastOnline > 1592486978, dotProduct(likedUserSet, {\"777\": 1})) AND !(userId contains \"777\") limit 2;"
},
...
Javaããã«ãŠã§ã¢ã³ã³ããã¯ããµãŒãã£ãŒãä»ããŠã«ã¹ã¿ã åŠçããžãã¯ãè¿œå ããããã¬ã³ãã©ãŒã䜿çšããŠçµæããã€ãã£ãã«çæãããããããã®åŒ·åãªããŒã«ã§ããSearcherã³ã³ããŒãã³ããã«ã¹ã¿ãã€ãºããŸãäžèšã®ãããªã±ãŒã¹ããæ€çŽ¢ã§æé»çã«äœæããããã®ä»ã®åŽé¢ãåŠçãããããããšãã°ãç§ãã¡ããµããŒããã補åã³ã³ã»ããã®1ã€ã¯ããçžåæ§ãã®ã¢ã€ãã¢ã§ããç¹å®ã®åºæºïŒå¹Žéœ¢ç¯å²ãè·é¢ãªã©ïŒã§ãŠãŒã¶ãŒãæ€çŽ¢ã§ããŸãããåè£è ã®æ€çŽ¢åºæºãæºããå¿ èŠããããŸãã Searcherã³ã³ããŒãã³ãã§ããããµããŒãããããã«ãæ€çŽ¢ããŠãããŠãŒã¶ãŒã®ããã¥ã¡ã³ãããã§ããããŠããã£ã«ã¿ãªã³ã°ãšã©ã³ã¯ä»ãã®ããã®åŸç¶ã®ãã©ãŒã¯ãããã¯ãšãªã§ãã®å±æ§ã®äžéšãæäŸããããšãã§ããŸããã©ã³ãã³ã°ãã¬ãŒã ã¯ãŒã¯ãšã«ã¹ã¿ã ããã«ãŠã§ã¢ã¯äžç·ã«ãªã£ãŠãè€æ°ã®ãŠãŒã¹ã±ãŒã¹ããµããŒãããæè»ãªæ¹æ³ãæäŸããŸãããããã®äŸã§ã¯ãããã€ãã®åŽé¢ã®ã¿ãåãäžããŸããããããã§ã¯ 詳现ãªããã¥ã¡ã³ããèŠã€ããããšãã§ããŸãã
Vespaã¯ã©ã¹ã¿ãŒãæ§ç¯ããŠæ¬çªç°å¢ã«ç§»è¡ããæ¹æ³
2019幎æ¥ãæ°ã·ã¹ãã ã®äŒç»ãéå§ããŸããããã®éãVespaããŒã ã«ãé£çµ¡ãåãããŠãŒã¹ã±ãŒã¹ã«ã€ããŠå®æçã«çžè«ããŸãããéçšããŒã ã¯ã¯ã©ã¹ã¿ãŒã®åæèšå®ãè©äŸ¡ããã³æ§ç¯ããããã¯ãšã³ãããŒã ã¯ããŸããŸãªVespaã®ãŠãŒã¹ã±ãŒã¹ã®ææžåãèšèšãããã³ãããã¿ã€ãäœæãéå§ããŸããã
ãããã¿ã€ãã³ã°ã®æåã®æ®µé
OkCupidããã¯ãšã³ãã·ã¹ãã ã¯Golangããã³C ++ã§èšè¿°ãããŠããŸããã«ã¹ã¿ã Vespaããžãã¯ã³ã³ããŒãã³ããäœæããJava Vespa HTTPãã£ãŒãã¯ã©ã€ã¢ã³ãAPIã䜿çšããŠé«ããã£ãŒãã¬ãŒããæäŸããã«ã¯ãJVMç°å¢ã«å°ãæ £ããå¿ èŠããããŸãããVespaã³ã³ããŒãã³ãã®æ§ææãšãã£ãŒããã€ãã©ã€ã³ã§Kotlinã䜿çšããããšã«ãªããŸããã
ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã移æ€ããŠVespaæ©èœãçºè¡šããå¿ èŠã«å¿ããŠVespaããŒã ã«çžè«ããã®ã«ãæ°å¹ŽããããŸãããããããšã³ãžã³ã®ã·ã¹ãã ããžãã¯ã®ã»ãšãã©ã¯C ++ã§èšè¿°ãããŠãããããçŸåšã®ãã£ã«ã¿ãŒãšãœãŒãããŒã¿ã¢ãã«ããRESTãä»ããŠVespaã¯ã©ã¹ã¿ãŒã«çºè¡ããåçã®YQLã¯ãšãªã«å€æããããžãã¯ãè¿œå ããŸãããæ©ã段éã§ãããã¥ã¡ã³ãã®å®å šãªãŠãŒã¶ãŒããŒã¹ã§ã¯ã©ã¹ã¿ãŒãåäœæããããã®åªãããã€ãã©ã€ã³ã®äœæã«ãåãçµã¿ãŸããããããã¿ã€ãã³ã°ã«ã¯ã䜿çšããæ£ãããã£ãŒã«ãã¿ã€ãã決å®ããããã«å€ãã®å€æŽãå«ããå¿ èŠãããã誀ã£ãŠããã¥ã¡ã³ããã£ãŒããåéä¿¡ããå¿ èŠããããŸãã
ã¢ãã¿ãªã³ã°ãšã¹ãã¬ã¹ãã¹ã
Vespaæ€çŽ¢ã¯ã©ã¹ã¿ãŒãäœæãããšãã2ã€ã®ããšã確èªããå¿ èŠããããŸãããããã¯ãäºæ³ãããéã®æ€çŽ¢ã¯ãšãªãšã¬ã³ãŒããåŠçã§ããããšãšãã·ã¹ãã ãæäŸããæšå¥šäºé ã®å質ãæ¢åã®ãã¢ãªã³ã°ã·ã¹ãã ãšåçã§ããããšã§ãã
è² è·ãã¹ãã®åã«ãPrometheusã¡ããªãã¯ãããããšããã«è¿œå ããŸãããVespa-exporterã¯å€§éã®çµ±èšãæäŸããVespaèªäœãè¿œå ã®ã¡ããªãã¯ã®å°ããªã»ãããæäŸããŸããããã«åºã¥ããŠã1ç§ãããã®ãªã¯ãšã¹ãæ°ãåŸ ã¡æéãVespaããã»ã¹ã«ãããªãœãŒã¹äœ¿çšçãªã©ãããŸããŸãªGrafanaããã·ã¥ããŒããäœæããŸããããŸããvespa-fbenchãå®è¡ããŠã¯ãšãªã®ããã©ãŒãã³ã¹ããã¹ãããŸããã Vespaéçºè ã®å©ããåããŠãç§ãã¡ã¯æ¯èŒçé«ãããã«ããã決å®ããŸããéçãªèŠæ±ã®ã³ã¹ãã¯ãç§ãã¡ã®ã°ã«ãŒãåãããæ¢è£œã®ã¬ã€ã¢ãŠãã¯ãããé«éãªçµæãæäŸããŸãããã©ããã¬ã€ã¢ãŠãã§ã¯ãããŒããè¿œå ãããšãåºæ¬çã«åçã¯ãšãªïŒã€ãŸããã€ã³ããã¯ã¹ä»ããããããã¥ã¡ã³ãã®æ°ã«äŸåããã¯ãšãªã®éšåïŒã®ã³ã¹ããåæžãããã ãã§ããã°ã«ãŒãåãããã¬ã€ã¢ãŠããšã¯ãæ§æãããåãµã€ãã°ã«ãŒãã«ããã¥ã¡ã³ãã®å®å šãªã»ãããå«ãŸããããã1ã€ã®ã°ã«ãŒããèŠæ±ãåŠçã§ããããšãæå³ããŸããéçãªã¯ãšã¹ãã®ã³ã¹ããé«ããããããŒãã®æ°ãåãã«ä¿ã¡ãªãããã¹ã«ãŒããããå€§å¹ ã«åäžããããã©ããã°ã«ãŒãã®æ°ã1ã€ãã3ã€ã«å¢ãããŸãããæåŸã«ãéçãã³ãããŒã¯ã®ä¿¡é Œæ§ã«èªä¿¡ãæãŠãããã«ãªã£ããšãã«ãå ±åãããŠããªããã·ã£ããŠãã©ãã£ãã¯ãããªã¢ã«ã¿ã€ã ã§ãã¹ãããŸããã
ããã©ãŒãã³ã¹ã®æé©å
ãã§ãã¯ã¢ãŠãã®ããã©ãŒãã³ã¹ã¯ãç§ãã¡ãæ©ã段éã§çŽé¢ããæ倧ã®ããŒãã«ã®1ã€ã§ãããåœåã1000 QPSïŒ1ç§ãããã®ãªã¯ãšã¹ãæ°ïŒã§ãæŽæ°ã®åŠçã«åé¡ããããŸãããå éã»ãããã£ãŒã«ããå€çšããŸããããæåã¯å¹æããããŸããã§ããã幞ããªããšã«ãVespaã®éçºè ã¯ããããã®åé¡ãããŒã¿é åžã«é¢é£ããä»ã®åé¡ã®è§£æ±ºãè¿ éã«æ¯æŽããŸããã圌ãã¯åŸã«ããã£ãŒãã®ãµã€ãºèšå®ã«é¢ããåºç¯ãªããã¥ã¡ã³ããè¿œå ããŸãããããã¯ãããçšåºŠäœ¿çšããŠããŸãã倧ããªå éã»ããã®æŽæ°ãã£ãŒã«ãã¯ãå¯èœã§ããã°ã
visibility-delay
è€æ°ã®æ¡ä»¶ä»ãæŽæ°ã䜿çšããå±æ§ãã£ãŒã«ãïŒã€ãŸããã¡ã¢ãªå
ïŒã«äŸåãããšãšãã«ãfmdovãã€ãã©ã€ã³ã®æäœãå§çž®ããã³ããŒãžããããšã«ãããã¯ã©ã€ã¢ã³ãããã®ã©ãŠã³ãããªãããã±ããã®æ°ãæžãããŸããçŸåšããã€ãã©ã€ã³ã¯å®åžžç¶æ
ã§3000 QPSãéãã«åŠçããŠããããã®ãããªã¹ãã€ã¯ãäœããã®çç±ã§çºçããå Žåãç§ãã¡ã®è¬èãªã¯ã©ã¹ã¿ãŒã¯11KQPSã®æŽæ°ãåŠçããŠããŸãã
æšå¥šã®å質
ã¯ã©ã¹ã¿ãè² è·ãåŠçã§ããããšã確èªããåŸãæšå¥šäºé ã®å質ãæ¢åã®ã·ã¹ãã ãããæªããªãããšã確èªããå¿ èŠããããŸãããã©ã³ã¯ä»ãã®å®è£ ã«ããããªéãããããšãæšå¥šäºé ã®å šäœçãªå質ãšå šäœçãªãšã³ã·ã¹ãã ã«å€§ããªåœ±é¿ãåãŒããŸããå®éšã·ã¹ãã ãé©çšããŸããäžéšã®ãã¹ãã°ã«ãŒãã§ã¯Vespaã䜿çšãããŸããããã³ã³ãããŒã«ã°ã«ãŒãã§ã¯åŒãç¶ãæ¢åã®ã·ã¹ãã ã䜿çšãããŸããã次ã«ãããã€ãã®ããžãã¹ã¡ããªãã¯ãåæãããVespaã°ã«ãŒããã³ã³ãããŒã«ã°ã«ãŒããããåªããŠãããšã¯èšããªããŸã§ããããã©ãŒãã³ã¹ãåäžãããŸã§åé¡ãç¹°ãè¿ãããææžåãããŸãããVespaã®çµæã«èªä¿¡ãæãŠãã°ãäžèŽãªã¯ãšã¹ããVespaã¯ã©ã¹ã¿ãŒã«è»¢éããã®ã¯ç°¡åã§ããããã¹ãŠã®æ€çŽ¢ãã©ãã£ãã¯ãåé¡ãªãVespaã¯ã©ã¹ã¿ãŒã«èµ·åããããšãã§ããŸããã
ã·ã¹ãã å³
ç°¡ç¥åãã圢åŒã§ã¯ãæ°ããã·ã¹ãã ã®æçµçãªã¢ãŒããã¯ãã£å³ã¯æ¬¡ã®ããã«ãªããŸãã
Vespaã®çŸåšã®ä»çµã¿ãšæ¬¡ã®ã¹ããã
Vespaãã¢ãã¡ã€ã³ããŒã®ç¶æ ã以åã®ã·ã¹ãã ãšæ¯èŒããŠã¿ãŸãããã
- ã¹ããŒãã®æŽæ°
- 以åïŒæ°çŸè¡ã®æ°ããã³ãŒããå«ã1é±éãè€æ°ã®ãµãã·ã¹ãã ãšæ
éã«èª¿æŽãããå±é
- :
- 以åïŒæ°çŸè¡ã®æ°ããã³ãŒããå«ã1é±éãè€æ°ã®ãµãã·ã¹ãã ãšæ
éã«èª¿æŽãããå±é
- /
- :
- : . , !
- :
-
- : ,
- : , Vespa . -
- : ,
å šäœãšããŠãVespaã¯ã©ã¹ã¿ãŒã®èšèšãšä¿å®ã®åŽé¢ã¯ããã¹ãŠã®OkCupid補åã®éçºã«åœ¹ç«ã£ãŠããŸãã2020幎1ææ«ã«ãVespaã¯ã©ã¹ã¿ãŒãæ¬çªç°å¢ã«ç§»è¡ãããã¢ã®æ€çŽ¢ã«ããããã¹ãŠã®æšå¥šäºé ãæäŸããŸãããŸããä»å¹Žã¯Stacksãªã©ã®ãã¹ãŠã®æ°æ©èœããµããŒãããããã«ãæ°åã®æ°ãããã£ãŒã«ããã©ã³ãã³ã°åŒãããã³ãŠãŒã¹ã±ãŒã¹ãè¿œå ããŸããããŸãã以åã®ãããã¡ã€ãã³ã°ã·ã¹ãã ãšã¯ç°ãªããã¯ãšãªæã«ãªã¢ã«ã¿ã€ã ã®æ©æ¢°åŠç¿ã¢ãã«ã䜿çšããããã«ãªããŸããã
次ã¯äœã§ããïŒ
ç§ãã¡ã«ãšã£ãŠãVespaã®äž»ãªå©ç¹ã®1ã€ã¯ããã³ãµãŒã䜿çšããã©ã³ãã³ã°ã®çŽæ¥ãµããŒããšãTensorFlowãªã©ã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãã¬ãŒãã³ã°ãããã¢ãã«ãšã®çµ±åã§ããããã¯ãä»åŸæ°ãæã§éçºããäž»ãªæ©èœã®1ã€ã§ãããã§ã«ããã€ãã®ãŠãŒã¹ã±ãŒã¹ã§ãã³ãµãŒã䜿çšããŠããããŠãŒã¶ãŒã®çµæãšäžèŽãããæ£ç¢ºã«äºæž¬ã§ããããã«ãããŸããŸãªæ©æ¢°åŠç¿ã¢ãã«ã®çµ±åãéããªãæ€èšããŸãã
ããã«ãVespaã¯æè¿ãå®å šã«ãªã¢ã«ã¿ã€ã ã§ãåæã«æ€çŽ¢å¯èœã§ãåçã«æŽæ°ãããå€æ¬¡å æè¿åã€ã³ããã¯ã¹ã®ãµããŒããçºè¡šããŸããããªã¢ã«ã¿ã€ã ã®æè¿åã€ã³ããã¯ã¹æ€çŽ¢ã®ä»ã®äœ¿çšäŸã調æ»ããããšã«éåžžã«èå³ããããŸãã
OkCupidãšVespaãè¡ãïŒ
å€ãã®äººãElasticsearchãèãããã䜿çšãããããŠããŸãããVespaã®åšãã«ã¯ããã»ã©å€§ããªã³ãã¥ããã£ã¯ãããŸãããä»ã®å€ãã®Elasticsearchã¢ããªã±ãŒã·ã§ã³ãVespaã§ããé©åã«æ©èœãããšä¿¡ããŠããŸãã OkCupidã«ãšã£ãŠã¯çŽ æŽãããããšã§ãããåãæ¿ããŠããã£ãã§ãããã®æ°ããã¢ãŒããã¯ãã£ã«ãããæ°ããæ©èœãã¯ããã«è¿ éã«é²åããã³éçºããããšãã§ããŸãããç§ãã¡ã¯æ¯èŒçå°ããªäŒç€Ÿãªã®ã§ããµãŒãã¹ã®è€éãã«ã€ããŠããŸãå¿é ããªãã®ã¯çŽ æŽãããããšã§ããããã§ãæ€çŽ¢ãšã³ãžã³ãã¹ã±ãŒã«ã¢ãŠãããæºåãæŽããŸããã Vespaããªããã°ãéå»1幎éã®é²æ©ã¯ç¢ºãã«ããåŸãŸããã§ããã Vespaã®æè¡çæ©èœã®è©³çŽ°ã«ã€ããŠã¯ã@ jobergumã®eã³ããŒã¹ã¬ã€ãã©ã€ã³ã«ããVespaAIã確èªããŠãã ããã
ç§ãã¡ã¯æåã®äžæ©ãèžã¿åºããVespaéçºè ã奜ãã§ããã圌ãã¯ç§ãã¡ã«ã¡ãã»ãŒãžãéãè¿ããŸããããããŠããã¯å¶ç¶ã§ããããšãããããŸããïŒ VespaããŒã ã®å©ãããªããã°ããããè¡ãããšã¯ã§ããŸããã§ãããæè¬@jobergumãš@geirstã©ã³ãã³ã°ãšã¯ãšãªåŠçã«é¢ããæšå¥šäºé ã«ã€ããŠã¯ãããã³@kkrauneãš@vekterli圌ãã®ãµããŒãã®ããã VespaããŒã ãç§ãã¡ã«äžããŠããããµããŒããšåªåã®ã¬ãã«ã¯æ¬åœã«é©ãã¹ããã®ã§ãã-ç§ãã¡ã®ãŠãŒã¹ã±ãŒã¹ãžã®æ·±ãæŽå¯ããããã©ãŒãã³ã¹ã®åé¡ã®èšºæãšVespaãšã³ãžã³ã®å³æã®æ¹åãŸã§ãåå¿@vekterliã¯ãã¥ãŒãšãŒã¯ã®ç§ãã¡ã®ãªãã£ã¹ã«é£ãã§ããšã³ãžã³ã®çµ±åãæ¯æŽããããã«1é±éç§ãã¡ãšçŽæ¥ååããŸããã VespaããŒã ã«æè¬ããŸãïŒ
çµè«ãšããŠãVespaã®äœ¿çšæ³ã®ããã€ãã®åŽé¢ã«è§Šããã ãã§ãããéå»1幎éã®ããã¯ãšã³ãããŒã ãšéçšããŒã ã®å€å€§ãªäœæ¥ããªããã°ãããã¯äžå¯èœã§ãããæ¢åã®ã·ã¹ãã ãšææ°ã®ãã¯ãããžãŒã¹ã¿ãã¯ãšã®éã®ã®ã£ãããåããããã«ãå€ãã®åºæã®èª²é¡ã«çŽé¢ããŸãããããããã¯ä»ã®èšäºã®ãããã¯ã§ãã