ãã®èšäºã¯ äžäŒ.com Advent Calendar 2023 6æ¥ç®ã®èšäºã§ãã äžäŒã¬ã¹ãã©ã³ã®éçºããŒã ã§ãšã³ãžãã¢ãããŠããéŠè¥¿ã§ãã ä»å㯠Solr ã¯ãšãªã®é床æ¹åã«ã€ããŠã話ããŸãã èæ¯ 2023幎10æãäžäŒã¬ã¹ãã©ã³ã®ã¹ããŒããã©ã³çš ã¬ã¹ãã©ã³è©³çްããŒãžããªãã¥ãŒã¢ã«ããŸããïŒ UI/UX ã®èŠçŽããšãšãã«ãäœ¿çšæè¡ãäžæ°ããŸããã ããã¯ãšã³ãèšèªïŒPython ãã Rustãž ããã³ããšã³ããã¬ãŒã ã¯ãŒã¯ïŒNuxt.js ãã Next.jsãž *1 ã¹ããŒããã©ã³çš ã¬ã¹ãã©ã³è©³çްããŒãž èª²é¡ ãæ¥ä»ãéžã¶ã«ã¬ã³ããŒã®è¡šç€ºãé
ãã 瀟å
éå®ãªãªãŒã¹ã®çŽåŸã倿¹é¢ãããã®å£°ãèãããŠããŸãã... ã¬ã¹ãã©ã³ãžè¡ãæ¥ä»ãéžã¶ã«ã¬ã³ããŒã¯äºçŽãããŒã®ç¬¬äžã¹ããããªã®ã§ã衚瀺é床ãé
ãããšã¯èŽåœçã§ãã ç¹ã«ãèšå®ããŒã¿ïŒæçã®ã³ãŒã¹çš®é¡ã»åžã®çš®é¡ãªã©ïŒãå€ãã¬ã¹ãã©ã³ã§ã¯ãã«ã¬ã³ããŒã®ç©ºåžç¶æ³ãååŸããã®ã«15ç§ä»¥äžãããããšãããããã®ãŸãŸã§ã¯æ£åŒãªãªãŒã¹ã§ããªãç¶æ³ã§ããã 空åžã«ã¬ã³ããŒã® UI äžäŒã¬ã¹ãã©ã³ã§ã¯ãåã¬ã¹ãã©ã³ã®ç©ºåžæ
å ±ãå
šææ€çŽ¢ã·ã¹ãã Solr ã«ã€ã³ããã¯ã¹ããäºçŽã§ããæ¥ã Solr ã§æ€çŽ¢ããŠç©ºåžç¶æ³ãååŸããŠããŸãã Solr ã«ã¯ãã¬ã¹ãã©ã³ã®èšå®ããŒã¿ããšã«ããã¥ã¡ã³ããäœæãã€ã³ããã¯ã¹ããŠããŸãããã®ããèšå®ããŒã¿ãå€ãã¬ã¹ãã©ã³ã¯æ€çŽ¢å¯Ÿè±¡ã®ããã¥ã¡ã³ãæ°ãèšå€§ã«ãªããæ€çŽ¢ã«æéãããã£ãŠããŸããã ãã£ãããš æ€çŽ¢ãã€ã¯ããµãŒãã¹ãçµç±ããã®ãããã Solr ãžã®ã¢ã¯ã»ã¹ã¯ãããã³ããšã³ã â ããã¯ãšã³ã â æ€çŽ¢ãã€ã¯ããµãŒãã¹ â Solrããšããæµãã§è¡ãããŸãã åŸæ¥ãããã£ãæ€çŽ¢ãã€ã¯ããµãŒãã¹ã®ãªãŒããŒãããã倧ããã£ããããæ€çŽ¢ãã€ã¯ããµãŒãã¹ãçµç±ããã®ããããŠããããã¯ãšã³ã â Solrãã«çŽæ¥ã¢ã¯ã»ã¹ããããã«ããŸããã æ€çŽ¢ãã€ã¯ããµãŒãã¹ïŒC#ïŒã§è¡ãããŠãã Solr ã¯ãšãªã®çµã¿ç«ãŠããSolr ããã®ã¬ã¹ãã³ã¹ããªããžã§ã¯ãã«å€æãåšåº«èšç®ãè¡ãåŠçããããã¯ãšã³ãïŒRustïŒã«ç§»è¡ããŸããã ã¯ã€ã«ãã«ãŒãã䜿ãããã«ãã Solr ã«ã€ã³ããã¯ã¹ãããŠããããŒã¿ã®ãªãã«ã¯ãæ¥ä»ããšã«ç°ãªãæ
å ±ãå«ãŸããŠããŸãããããã®æ
å ±ã¯ãããããç¹å®ã®æ¥ä»ïŒäŸïŒ231025ïŒãå«ããã£ãŒã«ãåã§è¡šçŸãããŠããŸãã "231025Close_tdt": "2023-10-21T00:00:00Z", "231025VisitTimeFrom_tdt": "2023-10-25T18:00:00Z", "231025VisitTimeTo_tdt": "2023-10-25T18:30:00Z", "231025HasInventory_b": true, "231025HasRotationOrBlockTime_b": false, "231025Inventory_ti": 1, "231025SalesUpperLimitOver_b": false, äŸãã°ãå
1ãæåã®åæ¥ä»ã®æ
å ±ãååŸããå Žåã以äžã®ãã㪠Solr ã¯ãšãªãçæããŠããŸããã // 倿Žå fl=231025Close_tdt,231025VisitTimeFrom_tdt,231025VisitTimeTo_tdt,231025HasInventory_b,231025HasRotationOrBlockTime_b,231025Inventory_ti,231025SalesUpperLimitOver_b,231026Close_tdt,231026VisitTimeFrom_tdt,231026VisitTimeTo_tdt,231026HasInventory_b,231026HasRotationOrBlockTime_b,231026Inventory_ti,231026SalesUpperLimitOver_b,231027Close_tdt,231027VisitTimeFrom_tdt,231027VisitTimeTo_tdt,231027HasInventory_b,231027HasRotationOrBlockTime_b,231027Inventory_ti,231027SalesUpperLimitOver_b,231028Close_tdt,231028VisitTimeFrom_tdt,231028VisitTimeTo_tdt,231028HasInventory_b,231028HasRotationOrBlockTime_b,231028Inventory_ti,231028SalesUpperLimitOver_b,231029Close_tdt,231029VisitTimeFrom_tdt,231029VisitTimeTo_tdt,231029HasInventory_b,231029HasRotationOrBlockTime_b,231029Inventory_ti,231029SalesUpperLimitOver_b,231030Close_tdt,231030VisitTimeFrom_tdt,231030VisitTimeTo_tdt,231030HasInventory_b,231030HasRotationOrBlockTime_b,231030Inventory_ti,231030SalesUpperLimitOver_b...ã€ã¥ã field list ã§ã231025ã®ãã£ãŒã«ã矀,231026ã®ãã£ãŒã«ã矀,231027ã®ãã£ãŒã«ã矀 ...ãã®ããã«ãç¹å®ã®æ¥ä»ãå«ãŸãããã£ãŒã«ã矀ãåå¥ã«æå®ããŠããŸããããæ¥ä»éšåïŒ231025ïŒãã¯ã€ã«ãã«ãŒãïŒ??????ïŒã«çœ®ãæããŠã??????ã®ãã£ãŒã«ã矀ããšããæžãæ¹ã«å€æŽããŸããã // 倿ŽåŸ fl=??????Close_tdt,??????VisitTimeFrom_tdt,??????VisitTimeTo_tdt,??????HasInventory_b,??????HasRotationOrBlockTime_b,??????Inventory_ti,??????SalesUpperLimitOver_b ãã®å€æŽã«ãããèšå®ããŒã¿ãå€ãã¬ã¹ãã©ã³ã§ã¯ã¬ã¹ãã³ã¹ã¿ã€ã ãçŽ 1/5 ã«ççž®ããã倧ããªæ¹å广ãåŸãããŸããïŒ 100ä»¶ãã€äžŠåã§ååŸããããã«ãã æåã«ãæ€çŽ¢çµæã®ç·ä»¶æ°ã®ã¿ãååŸããç·ä»¶æ°ã100ã§å²ã£ãŠäœåååŸããã°ããã倿ãã100ä»¶ãã€äžŠåã§ Solr ã«ãªã¯ãšã¹ããéãããã«ããŸããã Rust ã§ Solr ããçµæãååŸãããµã³ãã«ã³ãŒãã§ãã search_calendar ã«ã«ã¬ã³ããŒã®æ€çŽ¢æ¡ä»¶ãæž¡ããšããŸã Solr ããç·ä»¶æ°ãååŸãããã®ããš100ä»¶ãã€æ€çŽ¢çµæãååŸããŸãã pub async fn search_calendar ( & self , input: & model :: CalendarInput, ) -> anyhow :: Result < Vec < model :: Date >> { let rows = 100 ; let query = CalendarQuery (input. clone ()); // å
ã«ç·ä»¶æ°ã®ã¿ãååŸãã let total_count = self . get_solr_data ( & query, 0 , 0 ).await ? .response.total_count; let query = & query; // 100 ä»¶ãã€ååŸãã let futures = ( 0 ..total_count. div_ceil (rows)). map ( | n | async move { self . get_solr_data (query, n * rows, rows).await }); let res = futures_util :: future :: try_join_all (futures).await ? ; // 以äžç¥ïŒSolr ã®çµæãããšã«è¿ãå€ãäœãïŒ } äžèŠãª Solr ã¯ãšãªãåã æ¹ã㊠Solr ã¯ãšãªã«åé€ã§ããéšåããªããèŠçŽããŸããã äžèŠãªãã£ãŒã«ããååŸããŠããªãã ãŠãŒã¶ãŒã®æå®æ¡ä»¶ã«ãã£ãŠåé€ã§ãããã£ãŒã«ãã¯ãªãã ç¡é§ã« group , sort ã®æ©èœã䜿çšããŠããªãã ãšãã£ã芳ç¹ã§ãã§ãã¯ãè¡ããŸããã ææ ãã®æ¹åã«ãããã«ã¬ã³ããŒã®ç©ºåžç¶æ³ãååŸããã®ã«15ç§çšããã£ãŠããã®ã2ïœ3ç§çšåºŠã«ççž®ãããã¹ã ãŒãºãª UX ããŠãŒã¶ãŒã«æäŸããããšãã§ããŸããïŒ ãŸããã·ã¹ãã 芳ç¹ã§ã倧ããªå¹æããããŸããã ä»åã®é床æ¹å察象ã¯ãã¹ããŒããã©ã³çš ã¬ã¹ãã©ã³è©³çްããŒãžã®ã«ã¬ã³ããŒã®æ€çŽ¢åŠçã§ããããSolr å
šäœã®ããã©ãŒãã³ã¹ãåäžããŸããã Solr ã® CPU ã³ã¢äœ¿çšçãååä»¥äžæžå° Solr å
šäœã®ã¬ã¹ãã³ã¹ã¿ã€ã ã450ããªç§ãã200ããªç§çšåºŠã«ççž® Solr ã® CPU ã³ã¢äœ¿çšçãååä»¥äžæžå° Solr å
šäœã®ã¬ã¹ãã³ã¹ã¿ã€ã ã450ããªç§ãã200ããªç§çšåºŠã«ççž® äžäŒã¬ã¹ãã©ã³ã® Solr ã«é¢ããæ¹åç¹ã¯ãŸã å€ããããŸãããå°ããã€çå®ã«åãçµãã§ãããããšæããŸãã ãããã« äžäŒã§ã¯ããšãã«è¯ããµãŒãã¹ãã€ãã£ãŠãã仲éãåéäžã§ãïŒ www.ikyu.co.jp ã«ãžã¥ã¢ã«é¢è«ã宿œããŠããã®ã§ããæ°è»œã«ãå¿åãã ããã hrmos.co *1 : Next.js ã§èµ·ãã課é¡ã«ã€ããŠã¯ äžäŒ.com Advent Calendar 2023 15æ¥ç®ã®èšäºã§è§£èª¬äºå®ã§ãã