حانیه مهدی ابادی
حانیه مهدی ابادی
خواندن ۵ دقیقه·۳ سال پیش

سلام به Elasticsearch

سلام به همگی . تو این پست میخوایم یه سلامی به elastic بکنیم .فقط یه سلام!

فقط یه نکته کوچولو اینکه واسه همه چی نمیشه یه ترجمه گذاشت به نظرم جالب نیست خلاصه یه سری چیزا رو ببخشید.

من خودم مدتیه با elastic کار میکنم قبلا اسمشو شنیده بودم ولی خب سمتش نرفته بودم تا اینکه حالا الان قسمت شد و فهمیییدم چه قد خفنه واقعا دستشون درد نکنه :)

خب Elasticsearch یک موتور جستجو و تجزیه و تحلیل open-source که روی Apache Lucene ساخته شده و تو جاوا توسعه داده شده. Elasticsearch به شما امکان می ده حجم عظیمی از داده ها را به سرعت و در زمان واقعی ذخیره ، جستجو و تجزیه و تحلیل کنید و پاسخ همه این کارا رو تو میلی ثانیه بهتون میده . دارای API های REST گسترده ای برای ذخیره و جستجوی داده ها است. در اصل ، شما می تونین Elasticsearch را به عنوان سروری تصور کنید که می تونه درخواست های JSON را پردازش کنه و داده های JSON را به شما برگردونه.(اگه نمیدونین JSON چیه برین دنبالش چون ولتون نمیکنه)

حالا کجا ها استفاده میشه مثلا:

  • داده های ژنتیکی را با استفاده از Elasticsearch به عنوان ابزار تحقیق بیوانفورماتیک ذخیره و پردازش کنید
  • مدیریت ، ادغام و تجزیه و تحلیل اطلاعات فضایی با استفاده از Elasticsearch به عنوان یک سیستم اطلاعات جغرافیایی (GIS)
  • با استفاده از Elasticsearch به عنوان موتور ذخیره سازی ، گردش کارهای تجاری را خودکار کنید
  • ذخیره و تجزیه و تحلیل گزارش ها ، معیارها و داده های رویداد امنیتی
  • یک کادر جستجو به یک برنامه یا وب سایت اضافه کنید

حالا مثالای بالا رو که دیدین ولی دلیل اصلی وجود Elasticsearch برای سرچ کردنه .

مثلا فرض کنید میرین تو گوگل یه چیزیو سرچ میکنید اون میاد همه صفحه هایی واستون میاره که نزدیک باشه به اون چیزی که شما سرچ کردین کار الستیکم همین شکلیه میاد document هایی و میاره که نزدیک باشه به اون چیزی که میخواید.

کلا Elasticsearch میشه معرفیش کرد به عنوان document oriented search engin که منظور اینه می تونین توش برای یک document عملیات insert , delete,retrieve,search,analyze انجام بدین .

حالا یکم دقیق تر شیم . این document که میگیم چیه؟ ۱۰۰ درصد منظورمون این نیس

منظورمون اینه

Documents:

داکیومنتا میتونیم همون row توی database فرض کنید که نشون دهنده یک entity هست . این داکیومنتا تو قالب JSON توی الستیک ذخیره میشن .

Index:

میتونیم همون table توی database فرض کنید . که میشه مجموعه ای از داکیومنتا

خب حالا برگردیم سر مثالمون که از سرچ تو گوگل شروع شد . گفتیم Elasticsearch مثل همون کار میکنه ولی چه جوری ؟

اول فرض کنید یه کتاب کلمات دارین الان دنبال یه کلمه میخواین بگردین خب میرین تو فهرست و شماره صفحه رو پیدا میکنید .

کار Elastic مشابه اما چه جوری ؟ Elasticsearch از یک structure (ساختاری) به اسم inverted index استفاده میکنه که از جستجوهای بسیار سریع full-text پشتیبانی می کنه . کارش اینجوریه که میاد یه لیستی از کلمات منحصر به فرد توی هر داکیومنت درست میکنه از اون ور میاد میگه هر کدوم از این کلمات توی کدون داکیومنتا وجود داره ..

فرض کنید ۲ تا داکیومنت داریم که فیلدی به اسم content دارن که ۲ تا جمله زیرن محتواشن:

برای ایجاد یه inverted index ، ابتدا content هر داکیومنت را به کلمات جداگانه تقسیم می کنیم یک لیست مرتب شده از همه کلمات منحصر به فرد ایجاد می کنیم و بعد مشخص می کنیم که هر عبارت تو کدوم داکیومنت ظاهر می شه که یه نتیجه شبیه زیر داره :

همون طور که میبینین حتی به بزرگی و کوچیکی کلمات هم حساسه مثل quick و Quick

مثلا من اومدم عبارت quick brown سرچ کردم کاری که انجام میده :

خب الان هر ۲ تا داکیومنت اون شرط سرچ ما رو دارن خب ولی داکیومنت اول شباهت بیشتری داره مثلا الان بیایم یه الگوریتم ساده که بیاد تعداد شباهت و بشماره پیاده کنیم میاد داکیومنت ۱ نشون میده و تموم.

ولی حالا چندتا مشکل این جا هست مثلا :

  • اینجا quick و Quick اومده جدا شده و توی ۲ تا داکیومنت نشون داده شده خب برای کاربر فرقی نداره که این الان یه مشکل
  • برای کلمه های مثل fox و foxes خب اینم برای کاربر فرقی نداره که معنی اینا یکیه یعنی ریشه هاشون یکیه
  • برای کلمه های مثل jumped و leap خب معنی اینا هم یکیه دیگه بازم واسه کاربر فرقی نداره

بچه ها یه چیزی احساس کردم شاید پیش بیاد مثلا اینجوری فرض کنید میرید تو گوگل میزنید foxes انتظار ندارید که fox براتون نیاره که!! یا مثلا jumped(پریدن) میزنید انتظار دارین اون صفحه های مرتبط به leap هم بیاره دیگه تا تش اون چیزی که میخواین پیدا کنید :) اون مشکلای بالا رو اینجوری بهش فک کنید :)))))

حالا کاری که الستیک میکنه اینجوریه که،حالا نمیدونم بگم نگم طولانی نشه! حالا میگم دیگه ببخشید اگه طولانی شد :))

وقتی شما یه داکیومنت بخواین ذخیره کنید توی الستیک کاری که انجام میده برای تبدیل به inverted index اینه که میاد از یه مرحله ی Analyzer میگذرونه که خودش شامل ۲ تا مرحلس :

1-Tokenizer :

تقریبا میشه که جدا کردن کلمه ها بر اساس فاصله هایی که بغلشون و space ها (این یه تعریف کاملا مسخره به زبون خودم بود ۱۰۰ درصد میدونیم که تخصصی اصلا نیست )

2-Filter :

که الان میخوایم راجب این مرحله حرف بزنیم که مشکلاتمونو حل میکنه

بعد این مراحل میاد تو shard ذخیره میکنه (این مفهوم ایشالله تو پست بعد)

حالا اون ۲ تا جمله بالا مرحلهTokenize رد کرده میره سر مرحله Filter .

مرحله Filter به این صورته که باید از فیلترای زیر رد بشه :

Remove stop words:

همون کلمه هایی که زیاد میبینیم ولی خب اهمیتی ام نداره مثل the ، a،....

lowercasing:

بیایم همه کلمه هارو به حروف کوچیک تبدیل کنیم

Stemming:

بیایم ریشه یابی کنیم ، مثلا swimming تبدیل شه swim یا Foxes بشهFox

Synonyms:

کلمات هم معنی و پیدا کنیم مثلا jumped با leap هم معنی هستن

الان مثال بالای ما بعد این مراحل تبدیل میشه به این

از اون ور شما اگه سرچ کنید the Quick Brown حتی روی کويری شما این مراحل انجام میشه و تبدیل میشه به :quick brown بعد برای هر کلمه میاد مشخص میکنه تو کدوم داکیونتا هست و بهتون نشون میده

خب ببخشید طولانی شد امیدوارم مفید بوده باشه و استفاده کرده باشین .







elasticsearchinverted indexsearch engineالستیک سرچموتور جستجو
شاید از این پست‌ها خوشتان بیاید