مقالات

Elasticsearch چیست؟

Elasticsearch محصول شرکتی به نام الاستیک (Elastic) است که در سال ۲۰۱۲ بنیان گذاشته شد. Elasticsearch یک موتور جستجوی متن باز با تجزیه و تحلیل کامل است که به زبان جاوا توسعه یافته است. داده‌های غیرساختاریافته را از منابع مختلف می‌گیرد و آن را در یک فرمت پیچیده ذخیره می‌کند که برای جستجوی متنی بسیار بهینه است. Elasticsearch از Lucene Apache در هسته‌ی خود برای نمایه‌سازی و جستجو استفاده می‌کند. Lucene کتابخانه‌ای است که کار کردن با آن واقعا پیچیده است؛ اما لازم نیست نگران آن بود چرا که Elasticsearch تمام پیچیدگی‌ها را با فراهم کردن قابلیت استفاده از API از بین می‌برد. API به شکل API RESTful HTTP است که از JSON به عنوان فرمت تبادل داده استفاده می‌کند؛ در نتیجه با استفاده از Elasticsearch می‌توان حجم زیادی از داده‌ها را به روش سریع و کارآمد ذخیره و تحلیل کرد. این امر به خصوص در هنگام برخورد با داده‌های نیمه ساختاریافته‌ی زبان طبیعی بسیار مفید است.

 

Elasticsearch در کجا استفاده می‌شود؟

مقیاس پذیری (scalability) و سرعت Elasticsearch بالاست و می‌توان از آن برای موارد زیر استفاده کرد:

  • جستجوی برنامه
  • جستجوی وب سایت
  • جستجوی سازمانی
  • تحلیل و تجزیه‌ی اطلاعات ورودی
  • بررسی عملکرد برنامه
  • آنالیز و تجسم داده‌ها
  • تجزیه و تحلیل امنیتی
  • تجزیه و تحلیل تجاری

 

مفاهیم مورد استفاده‌ی Elasticsearch

برای آشنایی و درک بهتر اینکه Elasticsearch چیست؟ مفاهیمی وجود دارند که باید با آن‌ها آشنا شویم:

تقریبا بلادرنگ (Near Real-Time)

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

شاخص (Index)

Elasticsearch مجموعه‌ای از اسناد است که دارای ویژگی‌های مشابهی هستند. این داده‌ها با استفاده از دستورات SQL در یک یا چند شاخص ذخیره می‌شوند و از شاخص‌ها برای نگهداری و خواندن اسناد از آن استفاده می‌شود. در Elasticsearch، یک شاخص با نامی منحصر به فرد شناسایی می‌شود و باید تمام حروفش کوچک باشد. سپس از این نام برای اشاره به یک شاخص خاص در هنگام انجام فعالیت‌های مختلف بر روی اسناد موجود استفاده می‌شود.

سند (Document)

در Elasticsearch، یک سند، واحد اصلی اطلاعاتی است که می‌توان شاخص کرد. این اسناد شامل فیلدهای مختلفی هستند و هر یک از این فیلدها با نام خود شناسایی شده‌اند و می‌توانند حاوی یک یا چند مقدار باشند.

نوع (Type)

در Elasticsearch، یک نوع برای اسناد متشکل از مجموعه‌ا‌ی از فیلدها تعریف می‌شود. نوع سند توسط کاربر تعریف شده و همچنین می‌توان بیش از یک نوع را در یک شاخص مشخص کرد.

گره (Node)

گره به یک نمونه‌ از سرور Elasticsearch گفته می‌شود که داده‌ها را ذخیره می‌کند. یک گره دارای نام است و با آن شناسایی می‌شود. به طور پیش‌فرض در زمان شروع، یک شناسه‌ی منحصر به فرد تصادفی به گره تخصیص داده می‌شود. این نام برای اهداف اجرایی مورد استفاده قرار می‌گیرد.

خوشه (Cluster)

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

Shards

ذخیره‌ی حجم زیادی از اطلاعات می‌تواند فراتر از توانایی‌های یک سرور واحد باشد. برای حل این مشکل، Elasticsearch اجازه می‌دهد تا شاخص را به چند بخش تقسیم کرد که shards نامیده می‌شوند. تعداد بخش‌های مورد نیاز می‌تواند در حین ایجاد یک شاخص مشخص شود. هر shard برای هر شاخص کاملا مستقل است و می‌تواند میزبان هر گره‌ درون خوشه باشد.

Replicas

برای جلوگیری از هر نوع خطای تصادفی، مانند اشتراک‌گذاری یک گره‌ی آفلاین، Elasticsearch مفهومی شبیه به کپی را ارائه می‌دهد. Replicas در اصل فقط یک کپی دیگر از یک تکه است و می‌تواند برای پرس‌وجوها به عنوان تکه‌‌ی اصلی مورد استفاده قرار گیرد.

سازوکار Elasticsearch چیست؟

Elasticsearch مجموعه‌ای از اسناد است که با هم مرتبط هستند و داده‌ها را به عنوان اسناد JSON ذخیره می‌کند. هر سند مجموعه‌ای از کلیدها را با مقادیر متناظر خود مانند رشته‌ها، اعداد، Booleans، تاریخ‌ها، آرایه‌های حاوی مقادیر یا انواع دیگر داده‌ها مرتبط می‌کند.

Elasticsearch همچنین از یک ساختار داده با نام شاخص معکوس استفاده می‌کند که برای جستجوهای کامل متن (full text) طراحی شده‌است. یک شاخص معکوس، هر کلمه‌ی منحصر به فرد که در هر سند نمایان می‌شود را لیست می‌کند و تمام اسنادی را که آن کلمه در آن رخ می‌دهد را مشخص می‌کند.

در طول فرآیند شاخص‌گذاری، Elasticsearch اسناد را ذخیره کرده و یک شاخص معکوس ایجاد می‌کند تا داده‌ها در زمان واقعی قابل جستجو باشند. نمایه‌سازی با API آغاز می‌شود که از طریق آن می‌توان یک سند JSON را در یک شاخص مشخص بروزرسانی یا اضافه کرد. API‌های مطرح عبارتند از:

  • Index API: برای ثبت شاخص استفاده می‌شود.
  • Get API: برای بازیابی سند استفاده می‌شود.
  • API Search: برای ارسال درخواست و دریافت نتیجه استفاده می‌شود.
  • Put API: برای انتخاب گزینه‌های پیش‌فرض و تعریف نقشه استفاده‌ می‌شود.

همچنین می‌توان APIهای دیگری را براساس نیاز بررسی و ایجاد کرد؛ چراکه پروژه‌های دنیای واقعی نیازمند پرس‌وجوهای متفاوت در زمینه‌های گوناگون با اعمال شرایط مخصوص به خود هستند.

تمام این پیچیدگی را می‌توان از طریق پرس‌وجوها آسان کرد. DSL پرس‌وجویی قدرتمند است و برای رسیدگی به پیچیدگی از طریق یک پرس‌وجو طراحی شده‌ است. API‌های Elasticsearch به طور مستقیم با lucene ارتباط دارند و از همین نام برای کار با lucene استفاده می‌کنند. DSL نیز از Lucene TermQuery برای اجرا استفاده می‌کند.

مزایای استفاده از Elasticsearch چیست؟

استفاده از Elasticsearch دارای مزایای زیادی است؛ از این مزایا می‌توان به موارد زیر اشاره کرد:

  • مقیاس پذیری: یعنی با افزایش حجم داده‌ها، عملکرد همچنان بسیار ساده مانده و نتایج قابل‌اطمینان است. این یک ویژگی بسیار مهم است که به ساده‌سازی معماری‌های پیچیده و صرفه‌جویی در زمان در طول اجرای پروژه‌ها کمک می‌کند.
  • سرعت: Elasticsearch از شاخص‌گذاری معکوس استفاده می‌کند. همان‌طور که در بخش قبل آموختیم، شاخص‌گذاری معکوس یک روش مبتني بر کلمه است که براي جستجوی سريع اسناد شامل يک کلمه‌ی خاص به کار می‌رود. در نتیجه حتی زمانی هم که در مجموعه داده‌های بسیار بزرگ جستجو می‌کند، بسیار سریع است.
  • استفاده از API: Elasticsearch API‌های ساده RESTful را ارائه می‌دهد و از اسناد JSON، بدون الگو استفاده می‌کند که نمایه‌سازی، جستجو و پرس و جوی داده‌ها را بسیار آسان می‌سازد.
  • چندزبانه: یکی از ویژگی‌های Elasticsearch این است که چندزبانه است. این موتور از نوشتارهای گسترده‌ای در زبان‌های مختلف مانند عربی، برزیلی، چینی، انگلیسی، فرانسوی، کره‌ای و … پشتیبانی می‌کند.
  • بهینه‌ بودن در کار با اسناد: Elasticsearch ماهیت پیچیده‌ی دنیای واقعی را به عنوان اسناد JSON ساختاربندی کرده و تمام مفاهیم را به طور پیش‌فرض در یک شاخص (index) جمع‌آوری می‌کند تا بتوان داده‌ها را جستجو کرد. از آنجا که هیچ ردیف و ستون داده‌ای وجود ندارد، می‌توان به راحتی جستجوی متن کامل را انجام داد.
  • تکمیل خودکار: Elasticsearch با پیش‌بینی کلمه (حتی اگر شامل تعداد بسیار کمی از کاراکترها باشد) ، تعامل انسان و رایانه را سرعت می‌بخشد.
  • عاری از شما: Elasticsearch با وجود اینکه اسناد JSON را می‌پذیرد، عاری از شِما است. در واقع Elasticsearch سعی می‌کند ساختار داده‌ها را شناسایی کند، داده‌ها را شاخص‌بندی کند و در نهایت بتواند داده‌ها را جستجو کند.

معایب Elasticsearch چیست؟

باید توجه داشت که هنگامی از Elasticsearch باید استفاده کرد که داده‌های مورد بررسی دارای ویژگی‌هایی باشند که بتوان از نقاط قوت Elasticsearch استفاده کرد. چرا‌ که اگر این‌گونه نباشد، نتیجه معکوس خواهد شد و آن جنبه‌های بیان شده به‌عنوان مزایا، تبدیل به معایب کار می‌شوند. با این حال Elasticsearch نیز خالی از عیب نیست. برخی از این معایب عبارتند از:

  • Elasticsearch از لحاظ مدیریت درخواست و پاسخ هنگام کار با سرویس‌ها، برخلاف برخی سیستم‌ها که در فرمت‌های CSV، XML و JSON هم کار می‌کنند، پشتیبانی چند زبانی ندارد.
  • Elasticsearch همچنین دارای مشکل split brain می‌باشد. این مشکل هنگامی به وجود می‌آید که برقراری ارتباط بین سرورها قطع می‌شود و نگهداری دو مجموعه‌ی داده‌ی مجزا که در یک موضوع همپوشانی دارند، دچار مشکل می‌شود.
  • اگر فرد به آن مسلط نباشد، استفاده از ابزارهایی مانند Algolia آسان نیست. البته همان‌طور که گفتیم، Elasticsearch روشی قدرتمندتر و انعطاف‌پذیرتر از حالت عادی است، اما باز هم یادگیری آن زمانبر است.