من در این نوشته سعی کردم مقدماتی دربارهی ساختار الستیک سرچ داشته باشیم و سپس به نحوهی کارکردن با آن بپردازیم و انواع کوئریهایی که بیشترین استفادههارو دارن با هم ببینیم.
معرفی
الستیک سرچ یک موتور جستجوی توزیعشده و متنباز است که برای ذخیرهسازی، جستجو و تحلیل دادهها با سرعت و دقت بالا طراحی شده. این ابزار بر پایه کتابخانه معروف لوسین ساخته شده و یکی از پرکاربردترین ابزارها برای کار با دادههای بزرگ و متنوع به شمار میرود.
کاربردهای الستیک سرچ
جستجوی متنی:اگر در وبسایت یا اپلیکیشن خود به جستجوی پیشرفته نیاز دارید، الستیک سرچ انتخابی مناسب است.
تحلیل لاگها:برای جمعآوری و تحلیل لاگهای سیستمها استفاده میشود. این قابلیت به شما کمک میکند مشکلات را سریع شناسایی و برطرف کنید.
مانیتورینگ و تحلیل:با استفاده از ابزارهای جانبی مثل کیبانا و apm، میتوانید عملکرد سیستمها و سرورها را نظارت کنید.
تحلیل دادههای جغرافیایی:الستیک سرچ امکان کار با دادههای جغرافیایی را فراهم میکند. این ویژگی برای تحلیل موقعیت مکانی یا مسیریابی بسیار کاربردی است.
ویژگیهای کلیدی الستیک سرچ
۱. توزیعپذیری و مقیاسپذیری:الستیک سرچ طوری طراحی شده که در قالب یک کلاستر (خوشه) کار کند. کلاستر از چند نود (گره) تشکیل میشود و هر نود میتواند یک سرور مستقل باشد. دادهها در قالب شاردهایی تقسیم میشوند که این شاردها بین نودها توزیع میشوند. با افزودن نودهای جدید به کلاستر، ظرفیت سیستم افزایش پیدا میکند و عملکرد بهبود مییابد.
۲. جستجوی سریع:یکی از نقاط قوت الستیک سرچ سرعت بالای آن در جستجوهای پیچیده است. به دلیل استفاده از تکنیک شاخصگذاری معکوس، چه دادههای متنی، عددی یا ساختارنیافته، نتیجه را بسیار سریع دریافت خواهید کرد.
۳. انعطافپذیری در ذخیرهسازی دادهها:انواع مختلف داده مثل متن، عدد، تاریخ، موقعیت جغرافیایی و حتی دادههای باینری را میتوانید در این ابزار ذخیره و مدیریت کنید.
۴. ارتباط آسان با رابطهای ساده:تمام عملیات الستیک سرچ از طریق درخواستهای اینترنتی ساده (HTTP) قابل انجام است. این ویژگی کار با سیستمهای دیگر را بسیار آسان میکند.
۵. تحلیل دادهها:الستیک سرچ فقط برای جستجو طراحی نشده است؛ بلکه قابلیت انجام تحلیلهای پیچیده را نیز دارد. مثلاً میتوانید دادهها را گروهبندی کنید یا گزارشهای دقیق و جزئی تهیه کنید.
جستجو با الستیک سرچ
حالا بذار از اولش برات توضیح بدم که چطوری کار میکنه و داستانش چیه.
ورود داده (Indexing)
وقتی یه دادهای رو میخوایم وارد الستیک کنیم، این داده توی چیزی به اسم "ایندکس" ذخیره میشه. ایندکس رو میتونی یه جورایی مثل یه کشوی فایل در نظر بگیری که همهی اطلاعات مربوط به یه موضوع خاص اونجا ذخیره شده. قبل از این که داده وارد بشه، یه فرآیند به اسم آنالیز (Analyze) روش انجام میشه.
آنالیزر و فیلترها
آنالیزر، داده رو میگیره و خردش میکنه به تیکههای کوچیکتر که بهشون میگن توکن (Token). مثلاً جملهی «من الستیک سرچ دوست دارم» رو میشکنه به این تیکهها:
من ـ الستیک - سرچ - دوست - دارم
بعد از این مرحله، فیلترها وارد بازی میشن. فیلترها میتونن کارای مختلفی انجام بدن، مثلاً:
لوور کیس (Lowercase filter): همهی کلمات رو کوچیک میکنه (مثل تبدیل "Search" به "search").
استاپ ورد (Stopword filter): یه سری کلمات بیاهمیت مثل "و"، "از"، "به"،"the"،"in" رو حذف میکنه.
سنونیم (Synonym filter - Expansion): مترادفها و کلمه های مرتبط رو اضافه میکنه، مثلاً "ماشین" و "خودرو" رو یکی در نظر میگیره.(البته نیاز به کانفیگ های دقیق تری داره)
استیمینگ (Stemming) : کلمات مختلف با شکلهای گرامری یا صرفی متفاوت (مثل زمان، جمع، شناسهها) همگی به یه شکل سادهتر تبدیل بشن و در جستجوها بهعنوان یکسان شناخته بشن. مثلا گفتهایم → گفت - میگویم → گو - میروند → رو - رفته بود → رفت
جستجو (Querying)
وقتی کاربر یه چیزی سرچ میکنه، اون چیزی که سرچ کرده هم دقیقاً از همون مسیری که دادهها وارد شدن، رد میشه (یعنی آنالیز و فیلتر میشه). بعد الستیک میاد اون توکنها رو با دادههایی که ذخیره کرده مقایسه میکنه و بر اساس یه سری الگوریتم رتبهبندی (مثل TF-IDF یا BM25) نتایج رو مرتب میکنه.
جمعآوری نتیجه (Scoring and Results)
اینجاست که نتایج پیدا شده یه امتیاز (Score) میگیرن. این امتیاز نشون میده هر نتیجه چقدر به چیزی که کاربر سرچ کرده نزدیکه. در نهایت، الستیک سرچ یه لیست مرتب از نتایج رو برمیگردونه که میتونی به کاربر نشون بدی. مثلاً وقتی تو گوگل سرچ میکنی، نتایجی که اول میبینی امتیاز بالاتری گرفتن.
ساختار و اجزای اصلی
هر کلاستر یک نود اصلی یا مستر نود دارد که مسئول مدیریت شاردها و هماهنگی بین نودها است. سایر نودها میتوانند به عنوان نودهای داده یا نودهای مخصوص تحلیل و پردازش استفاده شوند. این ساختار توزیعشده باعث میشود که حتی در صورت خرابی یک نود، دادهها از طریق نسخههای کپی (رپلیکا) قابل بازیابی باشند.
مستر نود:مدیریت کلاستر، نظارت بر نودها، تخصیص شاردها و حفظ تعادل در کلاستر
کوردینیت نود: دریافت درخواست های جستجو و ایندکس، توزیع درخواست ها بین نودها و جمعآوری نتایج
دیتا نودها: ذخیرهسازی دادهها، اجرای عملیات جستجو و تحلیل روی شاردها، نگهداری از شاردهای اصلی و رپلیکا شاردها
شاخصها:دادهها در قالب شاخصها ذخیره میشوند. هر شاخص برای یک موضوع خاص طراحی شده است.
اسناد:هر داده به شکل یک سند ذخیره میشود که شامل فیلدها و مقادیر مرتبط است. معمولاً این اسناد در قالب JSON ذخیره میشوند.
شاردها:برای مدیریت بهتر دادهها، هر شاخص به بخشهای کوچکتری به نام شارد تقسیم میشود که میتوانند روی سرورهای مختلف قرار گیرند.
رپلیکاها:برای افزایش پایداری و جلوگیری از از دست رفتن دادهها، از نسخههای کپی شاردها به نام رپلیکا استفاده میشود.
انواع دادهها در الستیکسرچ
الستیکسرچ انواع مختلفی از دادهها را برای پشتیبانی از انواع مختلف اطلاعات ارائه میدهد:
انواع دادههای اصلی
نوع stringمنسوخ شده و با دو نوع مجزا جایگزین شده است:text، keyword
متن (Text): برای محتوای جستجوی کاملمتن (رشتههای تجزیهشده)
کلمه کلیدی (Keyword): برای جستجوی تطبیق دقیق (رشتههای بدون تجزیه)
عددی (Numeric): شامل عدد صحیح، عدد بلند، شناور، دبل
تاریخ (Date): زمانها و تاریخهای تقویمی
بولین (Boolean): مقادیر درست/نادرست
باینری (Binary): مقادیر باینری رمزگذاریشده با Base64
محدوده (Range): شامل integer_range، float_range، long_range، double_range، date_range، ip_range
انواع دادههای پیچیده
شیء (Object): برای اشیاء JSON تو در تو
تو در تو (Nested): برای آرایههای اشیایی که باید بهطور مستقل جستجو شوند
نقاط جغرافیایی Geo-point: برای جفتهای عرض و طول جغرافیایی
شکل جغرافیایی Geo-shape: برای اشکال جغرافیایی پیچیده
یا shape و point برای دادههای لزوما غیر جغرافیایی
انواع جستجوها در الستیکسرچ
الستیکسرچ انواع مختلفی از جستجوها را برای سناریوهای مختلف جستجو ارائه میدهد: