از ویرگول MySql‌ای به ویرگول ‌Elasticsearchای - قسمت ۱ (سرچ)

به زور ویرگولی اصلی(بخونید زاخار اصلی?) تصمیم گرفتم روند انتقال سرچ و آمار ویرگول از MySQL به Elasticsearch رو براتون بنویسم و این تجربه‌ای که داشتم رو باهاتون به اشتراک بذارم.

قصه از اونجا شروع می‌شه که یک روز بچه‌های ویرگولی(علی، علی، پیمان) گفتن کاش می‌شد سرچ توی ویرگول رو بهتر کنیم و چیزی که الان داریم رو بذاریم کنار چون خیلی داغون و نافرم و بده!! این شد که من، که تازه اسم الستیک به گوشم خورده بود و شنیده بودم توی سرچ متنی خیلی قَویه، پیشنهاد دادم که ببریمش روی الستیک و بچه‌ها هم موافقت کردن. شروع کردم به خوندن مستندهایی که بود و تست کردنش روی لپ‌تاپ خودم. هیچ ایده‌ای نداشتم چجوری باید باشه و هر روز بیشتر می‌خوندم و بیشتر یاد می‌گرفتم و خیلی برام جذاب بود. اما این تازه اول کلی داستان بود?‍♂️.

اولین مشکلی که داشتم درست کردن mapping بود. همون‌طور که توی MySQL می‌گیم هر ستون چه ویژگی‌هایی باید داشته‌باشه، توی الستیک هم با mapping اینو مشخص می‌کنیم. با اینکه کلی مستندها رو خوندم، هر چند وقت یه بار مجبور می‌شدم mapping رو عوض کنم چون یه چیز جدید یاد می‌گرفتم یا سرچ به مشکل می‌خورد و می‌فهمیدم مشکل از mapping اشتباهه. مثلا یه سری، هرچی روی timestamp سرچ می‌زدیم، هی غلط جواب می‌داد تا اینکه فهمیدم مشکل از اینجاست که بخش روز رو توی mapping بجای dd گذاشتم DD (امان از کپی‌پیست‌های ندانسته?). هر دفعه هم که یه مشکلی تو mapping پیدا می‌شد، مجبور می‌شدم شب بیدار بمونم که دیتاها رو از MySQL دوباره منتقل کنم به الستیک چون باید دیتاها پاک می‌شدند و دوباره توی الستیک ریخته می‌شدن، و این مسئله بار زیادی داشت و باید هم بین دیتای موجود و دیتای الستیک هماهنگی می‌بود و نیاز بود وقتی این کار رو بکنم که کاربری آنچنان توی سیستم نباشه که دیتای جدید تولید نشه و در کل خیلی بدبختی داشت. ولی خب بالاخره به جایی رسید که این مشکلات حل شدند.

یکی دیگه از بدختی‌ها این بود که برای بعضی از fieldهای فارسی، باید یک آنالیزور می‌ذاشتیم تا بشه بهتر سرچ کرد و نیاز به سرچ دقیق نباشه؛ یعنی مثلا فرقی بین فاصله و نیم فاصله یا ی و ي نباشه و چیزی که کاربر سرچ می‌کنه راحت‌تر پیدا بشه. کلی گشتم و یه ریپازیتوری توی گیت‌هاب پیدا کردم. با خیال راحت نصبش کردم و دیدم چقدر خوبه. ولی خب فقط یه مشکل داشت که هنوزم داره، اونم اینکه از نسخه‌های جدید الستیک پشتیبانی نمی‌کنه و صاحبش هم انگار دوست نداره آپدیتش کنه و جواب issueها رو بده? البته الان که دارم این نوشته رو می‌نویسم، فهمیدم چطوری خودم آپدیتش کنم و ازش بیلد بگیرم که بتونیم تو ورژن‌های جدید الستیک ازش استفاده کنیم?.

بعد از اینکه دیتاها آماده شدن، رفتم سراغ کد زدن واسه بخش سرچ ویرگول. سعی کردیم با تلفیق آنالیزورهای خود الستیک و اونی که پیدا کرده بودم، یک ضریب خوب برای هر کدوم پیدا کنیم که جواب‌های سرچ بهتر و دقیق‌تر باشن. برای این کار، حالت‌های مختلف رو امتحان کردیم که ببینیم وقتی یک کلمه سرچ می‌شه، بین جواب‌ها، جوابی که آنالیزور فارسی پیدا کرده بالاتر بیاد یا آنالیزوری که پیدا کردم یا آنالیزور انگلیسی.

حالا که همه چی درست شده بود، نوبت deploy کردنش روی سرور بود که این خودش داستان بزرگی بود. کلی باید می‌گشتم و مستند می‌خوندم که ببینم بهترین راهش چیه. کلی از deploymentهایی که آدما تو اینترنت گذاشتن رو تست کردم که ببینم کدوم جواب میده. یکی storageش درست وصل نمی‌شد، یکی نمی‌شد روش پلاگین نصب کرد، یکی باگ داشت و … خلاصه که دردسرش زیاد بود تا اینکه بالاخره تونستم راهش بندازم.

طی زمان هی مشکلات کد در می‌اومد و برطرفشون می‌کردم و گاها مجبور می‌شدم بخاطر مشکلاتی که سمت آپدیت الستیک از روی Mysql داشتیم(باگ‌های کد و ...) تا نصف شب بیدار بمونم? که بار سیستم کم بشه و دیتای جدید ساخته نشه و بتونم دوباره از نو اطلاعات رو بریزم تو الستیک(reindex). چون هر بار، همونطور که بالاتر گفتم، باید دیتاها پاک می‌شدن و خب سرچ از کار می‌افتاد. حتی یک بار یادم میاد که شب وقتی می‌خواستم reindex کنم، به مشکل خوردیم و نتونستم درستش کنم و به مدت یک روز سرچ از کار افتاده بود و دیتا توش نبود تا اینکه فهمیدیم مشکل از کم بودن پردازنده برای پادهای الستیکه و با زیاد کردنشون مشکلمون حل شد.

خوشبختانه توی سرچ مشکلات در همین حد بود. اون موقع این مشکلات واسم خیلی زیاد و بزرگ بنظر میومدن ولی خب وقتی خواستم آمار رو روی الستیک منتقل کنیم، تازه فهمیدم مشکل بزرگ یعنی چی?!! راجع به اون تو قسمت بعدی صحبت می‌کنم.