ã¿ãªãããããã«ã¡ã¯
以åã®èšäºã§ãæ°ããã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ãäœæããŸãã-é«éã§è±å¯ãªæ©èœãåããReindexerã§ãã
ãã®èšäºã§ã¯ãReindexerã䜿çšããŠãæå°éã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒããèšè¿°ããããšã§ããµã€ãã«å
šææ€çŽ¢ãå®è£
ããæ¹æ³ã説æããŸãã
äžè¬ã«ããã«ããã¹ããµã€ãæ€çŽ¢ã¯éèŠãªæ©èœã§ãããæè¿ã§ã¯ãããããã€ã³ã¿ãŒããããµã€ãã«äžå¯æ¬ ã§ãã æ€çŽ¢ã®å質ãšé床ã¯ç°ãªããŸã
ãŠãŒã¶ãŒãèå³ã®ããæ
å ±ã賌å
¥ãèšç»ããŠãã補åããã°ããèŠã€ããæ¹æ³ã
çŽ15ã20幎åãæ€çŽ¢ã¯å®å
šã«é察話åã§çŽ æŽã§ãã-ãµã€ãã«ã¯æ€çŽ¢è¡ãšãæ€çŽ¢ããã¿ã³ããããŸããã ãŠãŒã¶ãŒã¯æ£ããããå¿
èŠããããŸãã
å
¥åãã¹ãªãã§ãæ£ç¢ºãªåœ¢åŒã§æ€çŽ¢ããããã®ãå
¥åãããæ€çŽ¢ããã¿ã³ãã¯ãªãã¯ããŸãã 次-ããŒãžããªããŒãããŠããæ°ç§-ãããŠãããã«çµæããããŸãã
å€ãã®å ŽåããŠãŒã¶ãŒãèŠãããšãæåŸ
ããŠãããã®ã§ã¯ãããŸããã ãããŠããã¹ãŠãæ°ããæ¹æ³ã§ç¹°ãè¿ãããŸãããæ°ããã¯ãšãªããæ€çŽ¢ããã¿ã³ãåŸ
æ©æéãå
¥åããŠãã ããã ææ°ã®åºæº-UXãšãŠãŒã¶ãŒã®åºæ¬ååã®é²éªšãªmç¬ã
éå»æ°å幎ã«ããã£ãŠãæ€çŽ¢ãšã³ãžã³ã®ã¬ãã«ã¯å¹³åããŠå€§å¹
ã«åäžããŸãã-ã¿ã€ããã¹ãããŸããŸãªåèªåœ¢åŒã®åèªããŠãŒã¶ãŒã«èš±ãæºåãã§ããŠãããæãé«åºŠãªãã®ã¯ãæåå€æãŸãã¯ééã£ãããŒããŒãã¬ã€ã¢ãŠãã§å
¥åãããæ€çŽ¢ã¯ãšãªãå€æã§ããŸãïŒäŸïŒãzyltrcã-ãYandexãã誀ã£ãŠè±èªã®ã¬ã€ã¢ãŠãã«å
¥åããŸããã
ãŸããæ€çŽ¢ãšã³ãžã³ã®ã€ã³ã¿ã©ã¯ãã£ãæ§ãé«ãŸããŸãã-ããµãžã§ã¹ãããæäŸããããšãåŠã³ãŸãã-æ€çŽ¢è¡ã«å
¥åããå
容ããŠãŒã¶ãŒã«ææ¡ããŸããããšãã°ããŠãŒã¶ãŒããpreziããšå
¥åãå§ãããšãå
¥åæã«ãpresidentããšããåèªã«èªåçã«çœ®ãæããããŸãã
察話åæ€çŽ¢ã®ããã«é«åºŠãªããŒãžã§ã³ã¯ãå
¥åæã«æ€çŽ¢ãã§ãããŠãŒã¶ãŒãã¯ãšãªãå
¥åãããšãæ€çŽ¢çµæãèªåçã«è¡šç€ºãããŸãã
å€ãã®å¯èœæ§ããããŸããããããã¯ç¡æã§ã¯ãããŸãã-æ€çŽ¢ã§ä¿®æ£ã§ãããšã©ãŒãå€ãã»ã©ãåäœãé
ããªããŸãã ãŸããæ€çŽ¢ãé
ãå Žåããµãžã§ã¹ããšã€ã³ã¹ã¿ã³ãæ€çŽ¢ãå¿ããå¿
èŠããããŸãã
ãã®ãããéçºè
ã¯ãã°ãã°åŠ¥åããå¿
èŠããããŸã-æ©èœã®äžéšããªãã«ãããã察話æ©èœããªãã«ããããããŒããŠã§ã¢ã§ããµãããµãŒããŒã€ã³ãã©ã¹ãã©ã¯ãã£ã«å€é¡ã®è²»çšãè²»ãããŸãã
ã ããããã¯å°ãæè©ã ã£ãã ç·Žç¿ããŸããã-Reindexerã䜿çšããŠã劥åããããšãªããµã€ããæ€çŽ¢ããŸãã
ãããŠãçµæããããã«å§ããŸã-äœãèµ·ãã£ããïŒã³ã¡ã³ããšã¡ã¿ããŒã¿ãå«ãHabrå
šäœã解æãããªã€ã³ãã¯ãµãŒãããŒãããŠãHabrå
šäœã§ããã¯ãšã³ããšæ€çŽ¢ããã³ããšã³ããäœæããŸããã
çããŠãããšæããŠãäœãèµ·ãã£ãã®ãã¯ãã¡ãïŒ http : //habr-demo.reindexer.org/
ããŒã¿éã«ã€ããŠèšãã°ãããã¯çŽ5GBã®ããã¹ãã17äžä»¶ã®èšäºã600äžä»¶ã®ã³ã¡ã³ãã§ãã
æ€çŽ¢ã¯ãé³èš³ãäžæ£ãªããŒããŒãã¬ã€ã¢ãŠããã¿ã€ããã¹ãåèªåœ¢åŒãªã©ããã¹ãŠã®æ©èœã§åäœããŸãã
ãã ããå
責äºé
ã¯ã1é±éãå€æ¹ã«ä»ã®ããšããèªç±ã«ãèã®äžãã§çµã¿ç«ãŠããããããžã§ã¯ãã§ãã ãããã£ãŠãå³å¯ã«å€æããªãã§ãã ããã
第1 VPS 4x COREã12 GB RAMãæèŒã å°ãªããšããæ倧1åã®COREãããã³10GB RAMãå§çž®ããããšã¯å¯èœã§ãããå°ãäºåãæ®ããŸãã-çªç¶ã®ãããå¹æã§ãã
ãããžã§ã¯ãå
šäœã®å®è£
<1000è¡ã泚ç®ãã¹ãéšåã¯ãhtmlãããŒã¿æ§é ã«é
åžããhabraããŒãžã®ããŒãµãŒã§ãã
ããã«èšäºã§ã¯ããããã©ã®ããã«å®è£
ãããŠãããã説æããŸãã
ããã¯ãšã³ã
䜿çšãããæ§é ãšã³ã³ããŒãã³ã
ããã¯ãšã³ãã¯golangã¢ããªã±ãŒã·ã§ã³ã§ãã fasthttpããã³fasthttprouterã¯ãhttpãµãŒããŒããã³ã«ãŒã¿ãŒãšããŠäœ¿çšãããŸãã ãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ã
ä»ã®ãµãŒããŒãšã«ãŒã¿ãŒã®ã»ããã䜿çšããŸããããããã«ãšã©ãŸãããšã«ããŸããã
ããŒã¿ããŒã¹ãšããŠã reindexer ã䜿çšãããhtmlããŒãžã®è§£æã«äœ¿çšãããŸã-çŽ æŽãããgoqueryã©ã€ãã©ãª
ã¢ããªã±ãŒã·ã§ã³æ§é ã¯éåžžã«åçŽã§ã4ã€ã®ã¢ãžã¥ãŒã«ã®ã¿ã§æ§æãããŠããŸãã
- ãªããžããª-ããŒã¿ãŠã§ã¢ããŠã¹ã®æäœãšããã®äžã®ããŒã¿ã¢ãã«ã®èª¬æãæ
åœããŸãã
- HTTP-ãªã¯ãšã¹ãã®åŠçãæ
åœ
- ããŒãµãŒ-HabrããŒãžã®è§£æãæ
åœ
- main-ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ã®åŠçãšã³ã³ããŒãã³ãã®èµ·å/åæå
APIã¡ãœãã
- / api / search-æçš¿ãšã³ã¡ã³ãã®å
šææ€çŽ¢
- / api / posts /ïŒid-IDã§æçš¿ãååŸ
- / api / posts-ãã£ã«ã¿ãªã³ã°ã䜿çšããŠæçš¿ã®ãªã¹ããååŸãã
ããŒã¿ã¢ãã«
ããŒã¿ã¢ãã«ã¯golangæ§é ã§ãã Reindexerã䜿çšããå Žåãæ§é äœãã£ãŒã«ãã®ã¿ã°ã¯ããã£ãŒã«ãäžã«æ§ç¯ãããã€ã³ããã¯ã¹ãèšè¿°ããŸãã
ã€ã³ããã¯ã¹ã®éžæã«ã€ããŠè©³ãã説æããŸããã¯ãšãªã®å®è¡é床ãšæ¶è²»ãããã¡ã¢ãªã®äž¡æ¹ã¯ãã€ã³ããã¯ã¹ã®éžæã«äŸåããŸãã
ãããã£ãŠãæ€çŽ¢ãŸãã¯ãã£ã«ã¿ãªã³ã°ãããããšã«ãªã£ãŠãããã£ãŒã«ãã«æ£ããã€ã³ããã¯ã¹ãå²ãåœãŠãããšãéåžžã«éèŠã§ãã
ãã¹ãæ§é ïŒ
type HabrPost struct {
ã³ã¡ã³ãä»ãã®æ§é ã¯éåžžã«åçŽãªã®ã§ãããã§ã¯è©³ãã説æããŸããã
æ€çŽ¢æ¹æ³ã®å®è£
ãã³ãã©ãŒ
REST APIã¬ãã«ã§ã¯ããã³ãã©ãŒã¯éåžžã®fasthttpãã³ãã©ãŒã§ãã ãã®äž»ãªã¿ã¹ã¯ã¯ããªã¯ãšã¹ããã©ã¡ãŒã¿ã®ååŸããªããžããªå
ã®æ€çŽ¢ã¡ãœããã®åŒã³åºããã¯ã©ã€ã¢ã³ããžã®å¿çã®æäŸã§ãã
func SearchPosts(ctx *fasthttp.RequestCtx) {
æ€çŽ¢ã«ã¢ã¯ã»ã¹ããäž»ãªã¿ã¹ã¯ã¯ã SearchPosts
ãªããžããªSearchPosts
ã«ãã£ãŠå®è¡ãããŸãSearchPosts
ã¯ãšãªïŒã¯ãšãªïŒãçæããå¿çãåä¿¡ããŠââããå¿çãå€æããŸã
[]interface{}
ãHabrPost
ã¢ãã«ãžã®ãã€ã³ã¿ãŒã®é
åã«HabrPost
ãŸãã
func (r *Repo) SearchPosts(text string, offset, limit int, sortBy string, sortDesc bool) ([]*HabrPost, int, error) {
éåžžããµã€ãã®æ€çŽ¢æååã«ã¯ããç§åŠã®ããã°ããŒã¿ãããRust vs C ++ããªã©ãéåžžã®äººéã®èšèªã§ã¯ãšãªãå
¥åããå¿
èŠããããŸãããæ€çŽ¢ãšã³ãžã³ã¯è¿œå ã®æ€çŽ¢ãã©ã¡ãŒã¿ã瀺ãç¹å¥ãªDSL圢åŒã§ã¯ãšãªãéä¿¡ããå¿
èŠããããŸã
DSLã§ã¯ãæ€çŽ¢ãè¡ããããã£ãŒã«ããé¢é£æ§ã調æŽãããŸããããšãã°ãDSLã§ã¯ããèŠåºãããã£ãŒã«ãã§èŠã€ãã£ãçµæããæçš¿ããã¹ãããã£ãŒã«ãã§ã®çµæãããé¢é£æ§ãããããšãæå®ã§ããŸãã ãŸããDSLã®æ€çŽ¢ãªãã·ã§ã³ã¯ãããšãã°ãåèªã®æ£ç¢ºãªåºçŸã®ã¿ãæ€çŽ¢ããããåæã«æ€çŽ¢ããããã¿ã€ããã¹ã®ããåèªãæ€çŽ¢ããããªã©ã®ããã«æ§æãããŸãã
ReindexerãäŸå€ã§ã¯ãªããApplication DSLã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã githubã§å©çšå¯èœãª DSLããã¥ã¡ã³ã
textToReindexFullTextDSL
é¢æ°ã¯ãããã¹ããDSLã«å€æããŸãã é¢æ°ã¯æ¬¡ã®ããã«ããã¹ããå€æããŸãã
å
¥åãããããã¹ã | DSL | ã³ã¡ã³ã |
---|
ããã°ããŒã¿ | @*^0.4,user^1.0,title^1.6 **~ +**~ | tilte ãã£ãŒã«ãã«ããããšã®é¢é£æ§ã¯1.6ã§ããã user ãã£ãŒã«ãã«ããããšã¯1.0ã§ãã |
| | æ®ã-0.4ã ãã¹ãŠã®åèªåœ¢åŒã§ åèªãæ€çŽ¢ãã |
| | æ¥é èŸãŸãã¯æ¥å°ŸèŸãšããŠã ãã§ãªããã¿ã€ããã¹ããã³æ€çŽ¢ã§ã®æ€çŽ¢ |
| | æ¥å°ŸèŸãŸãã¯æ¥é èŸãšã㊠ãããã¹ãŠã®åèªåœ¢åŒ |
ããŒã¿ã®ååŸãšèªã¿èŸŒã¿
ãããã°ã®äŸ¿å®äžãHabrããããŒã¿ãåä¿¡/解æãããããã2ã€ã®å¥ã
ã®æ®µéã§ãªã€ã³ãã¯ãµãŒã«ããŒãããããã»ã¹ãåå²ããŸããã
ããŒã·ã ããã«
DownloadPost
é¢æ°ã¯ãHabrããŒãžã®ããŠã³ããŒããšè§£æãè¡ããŸã-ãã®ã¿ã¹ã¯ã¯ãHabrããæå®ãããIDãæã€èšäºãããŠã³ããŒãããåãåã£ãhtmlããŒãžã解æããèšäºããæåã®ç»åãèªã¿èŸŒãã§ãµã ãã€ã«ãäœæããããšã§ãã
DownloadPost
é¢æ°ã®çµæã¯ãèšäºã®ã³ã¡ã³ããšåçä»ãã®é
å[]byte
ãå«ãããã¹ãŠã®ãã£ãŒã«ããæã€å®å
šãªHabrPost
æ§é ã§ãã
ããŒãµãŒã®ä»çµã¿ã githubãèŠãããšãã§ããŸã
ããŒã¿ã€ã³ããŒãã¢ãŒãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯1ã360,000ã®IDãæã€ã«ãŒãã§DownloadPost
ãããã€ãã®ã¹ããªãŒã ã§åŒã³åºããçµæã¯jsonãã¡ã€ã«ãšjpgãã¡ã€ã«ã®ã»ããã«ä¿åãããŸãã
5ã€ã®ã¹ããªãŒã ã§ããŠã³ããŒãããå Žå-Habrå
šäœãçŽ8æéã§ããŠã³ããŒããããŸãã å¯èœãª360,000ã®èšäºã®ãã¡ãæ®ãã®IDã«ã€ããŠã¯ãæ£ããèšäºã«å¯Ÿããæ£ããèšäºã¯175,000ãããããŸãã
ãã®ãšã©ãŒãŸãã¯ãã®ãšã©ãŒãè¿ãããŸãã
解æãããããŒã¿ã®åèšéã¯çŽ5GBã§ãã
Reindexerãžã®ããŒã¿ã®èªã¿èŸŒã¿
Habrã®ã€ã³ããŒããå®äºãããšã170kã®jsonãã¡ã€ã«ãäœæãããŸãã é¢æ°RestoreAllFromFilesã¯ã Reindexerã§ãã¡ã€ã«ã®ã»ãããããŒããã圹å²ãæãããŸãã
ãã®é¢æ°ã¯ãä¿åãããåJSONãHabrPostæ§é ã«å€æãããã®posts
ãšcomments
ãã¬ãŒããèªã¿èŸŒã¿ãŸãã ã³ã¡ã³ãã¯åå¥ã®ãã¬ãŒãã§åŒ·èª¿è¡šç€ºããããããåã
ã®ã³ã¡ã³ããæ€çŽ¢ã§ããŸãã
å¥ã®æ¹æ³ã§ãã¹ãŠã1ã€ã®ããŒãã«ã«æ ŒçŽããããšãã§ããŸãïŒããã«ãããã¡ã¢ãªå
ã®ã€ã³ããã¯ã¹ã®ãµã€ãºãå°ãããªããŸãïŒããåã
ã®ã³ã¡ã³ããæ€çŽ¢ããããšã¯ã§ããŸããã
ãã®æäœã¯ããã»ã©é·ããããŸããããã¹ãŠã®ããŒã¿ã1ã€ã®ã¹ããªãŒã ã§Reindexerã«ããŒãããã®ã«çŽ5ã10åããããŸãã
å
šæ玢åŒèšå®
ãã«ããã¹ãã€ã³ããã¯ã¹ã«ã¯ãããŸããŸãªèšå®ããããŸãã ãããã®èšå®ã¯ãDSLããã®èšå®ãšãšãã«ãæ€çŽ¢ã®å質ãçŽæ¥æ±ºå®ããŸãã
次ã®èšå®ãå«ãŸããŸãã
- ãã¹ãããã¯ãŒããã®ãªã¹ãïŒãããã¯ããã¥ã¡ã³ãã§ãã䜿çšãããåèªã§ãããã»ãã³ãã£ãã¯ã®è² è·ã¯ãããŸããã
- 玢åŒäœæãªãã·ã§ã³ïŒæåå€æãµããŒã/ã¿ã€ããã¹/ããŒããŒãã¬ã€ã¢ãŠãã®èª€ã
- é¢é£æ§ãèšç®ããããã®åŒã®ä¿æ°ã bm25é¢æ°ãèŠã€ãã£ãåèªéã®è·é¢ãã¯ãšãªããã®åèªã®é·ããå®å
šäžèŽ/å®å
šäžèŽã§ã¯ãªãèšå·ã
ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ã InitãªããžããªãŒé¢æ°ãæ€çŽ¢ãã©ã¡ãŒã¿ãŒã®èšå®ãæ
åœããŸãã
Chromeããã³ããšã³ããšããšã³ãã¬ã¹ãã¹ã¯ããŒã«ã®ãã°ã«ã€ããŠ
ããã³ããšã³ãã¯vue.jsã«å®è£
ãããŠããŸã-https ://github.com/igtulm/reindex-search-ui
èªã¿èŸŒã¿çµæã§ãç¡éã®ãã¹ã¯ããŒã«ãè¡ã£ããšããGoogle Chromeã§éåžžã«äžå¿«ãªãã°ãçºçããŸãããåŸè
ã«ãããšãã¹ã¯ããŒã«äžã«ãµãŒããŒããå¿çãããŠã³ããŒãããã®ã«3ã4ç§ãããããšããããŸãã
ã©ãããŠïŒ ããªç§åäœã®åã€ã³ãã¯ãµãŒãåããé«éããã¯ãšã³ãããããããã§ã¯æ倧4ç§ã§ãã 圌ãã¯ç解ãå§ããŸããïŒ
ãµãŒããŒãã°ã«ãããšããã¹ãŠãåé¡ãããŸãã-åçã¯æ°ããªç§ã§äžããããŸãã
2018/04/22 16:27:27 GET /api/search?limit=10&query=php&search_type=posts 200 8374 2.410571ms 2018/04/22 16:27:28 GET /api/search?limit=10&offset=10&query=php&search_type=posts 200 9799 2.903561ms 2018/04/22 16:27:34 GET /api/search?limit=10&offset=20&query=php&search_type=posts 200 21390 1.889076ms 2018/04/22 16:27:42 GET /api/search?limit=10&offset=30&query=php&search_type=posts 200 8964 3.640659ms 2018/04/22 16:27:44 GET /api/search?limit=10&offset=40&query=php&search_type=posts 200 9781 2.051581ms
ãã¡ããããµãŒããŒãã°ã¯ç©¶æ¥µã®çå®ã§ã¯ãããŸããã ãããã£ãŠãtcpdumpçªç®ã®ãã©ãã£ãã¯ã調ã¹ãŸããã ãŸããtcpdumpã¯ããµãŒããŒãããªç§ã®åå ã§ããããšã確èªããŸããã
SafariãšFirefoxã§è©ŠããŠã¿ãŸãã-圌ãã¯ãã®ãããªåé¡ã¯ãããŸããã ãããã£ãŠãåé¡ã¯æããã«ããã¯ãšã³ãã®å¿çæéã§ã¯ãªããä»ã®ã©ããã«ãããŸãã
åé¡ã¯ãŸã Chromeã«ããããã§ãã
æ°æéã®ã°ãŒã°ã«ãå ±ãããŸãã-StackOverflowã«åé¿çã®èšäºããããŸã
ãŸããèšäºããéæ³ã®ãåé¿çããè¿œå ãããšãChromeã®åé¡ãéšåçã«ä¿®æ£ãããŸããã
mousewheelHandler(event) { if (event.deltaY === 1) { event.preventDefault(); } }
ãã ãããšã«ãããéåžžã«ç©æ¥µçã«ã¿ããããããã¹ã¯ããŒã«ãããšãé
延ãçããããšããããŸãã
ä»ã«äœã-çµè«ã®ä»£ããã«å°ããªããŒãã¹ãã©ãã¯
åã®èšäºã®å
¬é以æ¥ãå€ãã®æ°æ©èœãReindexerã«ç»å ŽããŸããã æãéèŠãªã®ã¯ãæ¬æ ŒçãªãµãŒããŒïŒã¹ã¿ã³ãã¢ãã³ïŒåäœã¢ãŒãã§ãã
ãµãŒããŒã¢ãŒãã®golang APIãåã蟌ã¿ã¢ãŒãã®APIãšå®å
šã«äºææ§ããããŸãã 1è¡ã眮ãæããããšã«ãããæ¢åã®ã¢ããªã±ãŒã·ã§ã³ãåã蟌ã¿ããã¹ã¿ã³ãã¢ãã³ã«åãæ¿ããããšãã§ããŸãã
ããã¯ãã¢ããªã±ãŒã·ã§ã³ãåã蟌ã¿ã¢ãŒãã§åäœããããŒã«ã«ãã¡ã€ã«ã·ã¹ãã äžã®ããŒã¿ã/tmp/reindex/testdb
db := reindexer.NewReindex("builtin:///tmp/reindex/testdb")
ããã¯ããããã¯ãŒã¯ãä»ããã¹ã¿ã³ãã¢ãã³ãµãŒããŒã§ã®ã¢ããªã±ãŒã·ã§ã³ã®åäœæ¹æ³ã§ãã
db := reindexer.NewReindex("cproto://127.0.0.1:6534/testdb")
ã¹ã¿ã³ãã¢ãã³ãµãŒããŒã¯ã dockerhubããã€ã³ã¹ããŒã«ãããããœãŒã¹ããçµã¿ç«ãŠãããšãã§ããŸã
ããã§ããé»å ±ã®å
¬åŒReindexerãµããŒããã£ãã«ãéããŸããã 質åãææ¡ãããå Žå-ããããïŒ