الاستیک سرچ (Elasticsearch) یک موتور جستجو است. این پلتفرم با خصوصیت NRT یا Near Real time شناخته می‌شود. اصطلاح Near Real time نیز به خاطر فاصله زمانی اندک بین Document کردن یک Index و اینکه بتوان آن را جستجو کرد به این پلتفرم داده شده است.

Cluster در Elasticsearch چیست؟

مفهوم Cluster شامل مجموعه‌ای از Node ها یا سرورهایی است که همگی داده‌های شما را در خود نگهداری می‌کنند. یک Cluster باعث می‌شود تا شما بتوانید بر روی تمامی Node ها، Indexing و سرچ کنید. نام Cluster باید یک نام خاص انتخاب شود زیرا برای اینکه بتوان یک Node را در یک Cluster قرار داد، نیاز به نام آن Cluster خاص داریم . انتخاب اینکه این نام بر چه اساسی انتخاب شود و شامل چه مقادیری باشد بسیار حائز اهمیت است. نام پیش فرض یک Cluster معمولا Elasticsearch است.

اصطلاح Node در Elasticsearch چه معنایی دارد؟

یک Node در واقع تنها شامل یک سروری است که در Cluster قرار دارد. این Node هم در جستجو و Indexing در یک Cluster نقش دارد و هم از داده‌های ما نگهداری می‌کند. انتخاب نام برای یک Node نیز مانند Cluster مهم است. نام پیش فرض یا UUID در هنگام ساخته شدن یک Node به صورت رندم تعیین می‌شود و شما می‌توانید بعدا آن را به دلخواه خود تغییر دهید. برای ادمین سایت ( Administration )، نام Node بسیار ارزشمند است زیرا برای نظارت بر یک سرور خاص، حتما باید نام آن را در اختیار داشته باشد. نام Node وابسته به نام Cluster است به طوری که اگر نام پیش فرض یک Cluster را که Elasticsearch است تغییر ندهیم، Node نیز به همین نام نمایش داده خواهد شد.

با Index در Elasticsearch آشنا شوید

یک index شامل مجموعه‌ای از document هایی است که ویژگی‌های مشابهی دارند که در ادامه به آن‌ها اشاره می‌کنیم. تمامی index ها باید با حروف کوچک نوشته شوند و شما می‌توانید به هر میزان که تمایل دارید بر روی یک Cluster ، index نگهداری کنید. تمامی عملیات‌های delete ، update ، indexing و search بر روی یک index قابل اجرا هستند.

Type در Elasticsearch

یک Type یا نوع، در واقع برای دسته‌بندی یا همان پارتیشن بندی یک Index استفاده می‌شود. به طور مثال، شما با استفاده از Type بندی Document ها در یک Index می‌توانید برای پسوردها و یا پست‌های یک وبلاگ دسته بندی متفاوتی را ایجاد کنید.

elastic search

Document در Elasticsearch چیست؟

یک Document ،سندی شامل مقادیری از اطلاعات است که قابلیت Index شدن را دارد. شما می‌توانید با Index / Type ، به هر تعدادی که تمایل دارید سند Document در Index ایجاد و نگهداری کنید. این Document ها به صورت JSON (اصطلاحی در برنامه نویسی وب که از آن برای ارسال داده از وب سرور به سمت یک صفحه وب استفاده می‌شود.) می‌باشند.

اصطلاح Shards & Replicas در Elasticsearch

یک Index قابلیت نگهداری مقادیر زیادی از اطلاعات را دارد اما این مقدار بی‌نهایت نیست و زمانی میرسد که طرفیت نهایی Node نیز پر شود. برای حل این مشکل می‌توان از قابلیت تقسیم شدن Index استفاده کرد. هر Index را می‌توان به بخش‌های کوچکتری که به هر کدام از آنها یک Shard گفته می‌شود تقسیم کرد. هر کدام از این قسمت‌ها به صورت مستقل از یکدیگر عمل میکنند به طوری که می‌توان هر قسمت از یک Index را بر روی قسمت دلخواهی از Node مستقر بر روی Cluster یک ذخیره نمود. قابلیت به 2 دلیل حائز اهمیت است.

1- به شما این امکان را می‌دهد که به صورت افقی، اطلاعات خود را تقسیم بندی کنید.

2- با استفاده از این قابلیت می‌توانید چندین عملیات را به صورت همزمان بر روی هر کدام از Shard ها انجام دهید. این قابلیت به ویژه در زمانی که Shard ها روی چند Node مختلف هستند بسیار کارآمد است. Elasticsearch نحوه توزیع Shard ها و اتصال Document به جستجوهای انجام شده را مدیریت می‌کند. در فضای مجازی، هر لحظه امکان از بین رفتن داده‌ها وجود دارد. برای جلوگیری از این اتفاق بهتر است از داده‌های خود یک نسخه پشتیبان تهیه کنید. Elasticsearch به شما این امکان را می‌دهد که هر تعداد نسخه کپی که نیاز دارید از Shard های خود تهیه کنید. به این نسخه‌ها Replica shard یا Replicas می‌گویند.

تهیه این نسخه‌های جایگزین 2مزیت دارد. اول اینکه در صورتی که یک Shard خراب شود، Node یک نسخه پشتیبان به شما می‌دهد. این پشتیبان هیچوقت بر روی همان Node ای که Shard اصلی روی آن قرار دارد، ذخیره نمی‌شود. دومین مزیت، افزایش دامنه جستجو بین Shard مختلف و Shard های اصلی و پشتیبان است. یک Shard می‌تواند با یا بدون نسخه پشتیبان باشد. به Shard اصلی، Shard original نیز می‌گویند.

در این مثال، مفهوم اصطلاح Shards & Replicas در Elasticsearch توضیح داده شده است

تست سلامت Cluster در Elasticsearch

تست سلامت cluster در Elasticsearch به منظور تایید نحوه کارکرد صحیح آن انجام می‌شود. برای بررسی سلامت cluster می‌توان از یک Api مانند نمونه زیر استفاده کرد.

GET localhost:9200/_cat/health?v

در این حالت یک request فرستاده شده و از cluster یک response برمیگردد. برای مشخص کردن اینکه وضعیت سلامت cluster به چه صورت است، بهتر از رنگ این موضوع را مشخص کنیم. رنگ سبز status بیانگر کارکرد صحیح cluster است. در صورتی که رنگ status زرد باشد، یعنی همه big data ها و data های کوچکتر موجود هستند اما بعضی از replica ها هنوز ساخته نشده اند. در صورتی که قسمتی از data ها موجود نباشد و cluster تا اندازی عملکرد نرمال داشته باشد، رنگ status قرمز خواهد شد.

در صورتی که قصد دریافت تمامی node های موجود در یک cluster را داشته باشیم می‌توانیم از تست زیر استفاده کنیم.

GET localhost:9200/_cat/nodes?v

در این حالت نیز یک request فرستاده شده و یک response از cluster برمیگردد.

ساخت یک Index در Cluster

جهت ساخت ایندکس cluster در Elasticsearch با استفاده از دستور زیر یک index به نام customer می‌سازیم.

PUT /customer?pretty

پس از آن با استفاده از دستور زیر، لیستی شامل تمامی‌های موجود در را مشاهده می‌کنیم.

GET /_cat/indices?v

Index وQuery یک Document

برای index یک customer document، ابتدا مقدار id را برابر 1 قرار داده سپس از طریق دستور زیر اینکار را انجام می‌دهیم.

PUT /customer/_doc/1?pretty
}
“name”: “John Doe”
{

سپس با استفاده از api و id ، همان document ای را که index کردیم از طریق دستور زیر دریافت میکنیم.

GET /customer/_doc/1?pretty

پاک کردن یک Index در Cluster

برای پاک کردن یک index از api زیر استفاده میکنیم.

DELETE /customer?pretty

مثال

در این مثال یک index با نام customer را پاک کردیم و همانطور که مشاهده می‌کنید، پس از حذف customer، لیست index های موجود را دریافت کردیم و index ای با نام customer در آن موجود نبود.

Indexing/Replacing Documents در Elasticsearch

حالا میخواهیم اضافه کردن یک سند Documents به Index  قبلی خود که با نام Customer قبلا ساخته شده را به شما آموزش دهیم. به این منظور ابتدا از Request زیر استفاده می‌کنیم.

این دستور یک document با id=1 ایجاد کرده و آن را در index ای به نام customer ذخیره و نگهداری می‌کند. اگر این دستور را با همان document مجددا تکرار کنیم، در این صورت Elasticsearch یک document جدید را با id=1 بر روی document قبلی ایجاد خواهد کرد.

این بار یک دستور جدید را امتحان می‌کنیم.

همانطور که ملاحظه می‌کنید، پس از GET کردن document جدید، مقدار فیلد name تغییر کرده است. در Elasticsearch تعیین مقدار برای id الزامی نیست و در صورتی که برای ایجاد یک document خاص نیازی به افزودن id نداشته باشید، می‌توانید از دستور POST استفاده کنید. نمونه این دستور را در زیر مشاهده می‌کنید.

همانطور که در فیلد -id- مشاهده می‌کنید، در این حالت یک id تصادفی برای document توسط Elasticsearch تعیین می‌شود.

به‌روزرسانی Document ها  در Elasticsearch

Elasticsearch، علاوه بر قابلیت index کردن و جایگزین کردن document ها، توانایی update کردن یک document را نیز دارد. به این منظور، ابتدا document قبلی را پاک می‌کند سپس document بروزرسانی شده را index می‌کند. در مثال زیر نحوه به روزرسانی یک document را مشاهده می‌کنید.در این مثال، فیلد name از مقدار John Doe  به NilaSoftware تغییر پیدا می‌کند.

همانطور که ملاحظه می‌کنید، پس از GET کردن document، مقدار فیلد name به درستی به NilaSoftware تغییر کرده است.

در مثال بعدی، فیلد age را هم به document خود اضافه می‌کنیم.

گاهی اوقات در فرآیند به روزرسانی از script های ساده استفاده می‌شود. به طور مثال، ابتدا مقدار فیلد age از document را با استفاده از script به 10 افزایش می‌دهیم. در مثال پایین عبارت ”ctx._source” اشاره به خود document دارد و ctx._source.age””  به فیلد age آن document اشاره می‌کند.

پس از GET کردن document، مشاهده می‌کنیم که مقدار age به 10 افزایش پیدا کرده است.

پاک کردن Document در Elasticsearch

برای پاک کردن document با id=2، از api زیر استفاده می‌کنیم.

پردازش دسته ای (Batch Processing) در Elasticsearch

یکی دیگر از قابلیت‌های Elasticsearch، امکان index کردن، به روزرسانی و پاک کردن document ها بصورت دسته‌ای می‌باشد. این کار سرعت انجام عملیات‌ها را در مقایسه با حالتی که عملیات‌ها به صورت جداگانه بر روی هر document انجام می‌شود، افزایش می‌دهد. در زیر 2 مثال ساده از این قابلیت را مشاهده می‌کنید.

با مفاهیم پایه‌ای همچون Cluster ، index و big data در مورد Elasticsearch آشنا شدیم. اکنون قصد داریم شما را با نحوه جستجو در دیتاها در Elasticsearch آشنا کنم. فرض میکنیم سندی با طرح زیر را در اختیار داریم.

لود کردن دیتای نمونه در Elasticsearch

ابتدا یک دیتا دانلود کرده و از طریق دستور زیر در cluster خود یک index کنید.

curl -H “Content-Type: application/json” -XPOST

“localhost:9200/bank/_doc/_bulk?pretty&refresh” –data-binary “@accounts.json”

بعد از آن، index های خود را GET کنید.

curl “localhost:9200/_cat/indices?v”

با این کار یک response به صورت زیر دریافت خواهید کرد.

The Search Api در Elasticsearch

در Elasticsearch دو راه برای جستجوی دیتا وجود دارد. یکی از راه‌ها انجام سرچ از طریق Rest Request URl  و دیگری، سرچ از طریق Rest Request Body است. سرچ‌هایی که از Request Body استفاده می‌کنند، واضح‌تر هستند و این سرچ، فرمت خوانا‌تری در JSON انجام میشود.

در این مقاله، ما به بررسی سرچ از طریق Rest Request Body می‌پردازیم اما برای کمک به درک این سرچ‌ها، یک مثال در مورد سرچ با Rest Request URL را با هم بررسی می‌کنیم.

برای انجام این نوع سرچ از api با endpoint برابر با _search استفاده می‌کنیم.

در  Api، پارامتر  q=*بیانگر این است که Elasticsearch، تمامی document ها را لود می‌کند.

عبارت بالا بیانگر این موضوع است که  تمامی document های موجود به صورت صعودی و با استفاده از فیلد account_number ترتیب‌بندی شوند. در زیر چند نمونه از فیلدهای مورد استفاده در elasticsearch را با هم مرور می‌کنیم.

took

بیانگر این موضوع است که زمان سرچ توسط elasticsearch در بازه میلی‌ثانیه است.

timed_out

تایم اوت شدن یا نشدن سرچ را نشان می‌دهد.

shards_

تعداد شاردهایی که سرچ بر روی آنها انجام شده است و همچنین تعداد شاردهای موفق و ناموفق را نشان می‌دهد.

hits

پاسخ سرچ را نمایش می‌دهد.

hits.total

بیانگر تعداد  document هایی که با پارامتر‌های سرچ ما همخوانی دارند.

hits.hits

آرایه‌های واقعی ( دیتاهای واقعی ) را نمایش می‌دهد.

hits.sort

کلید مرتب سازی است.

حالا می‌خواهیم یک عملیات سرچ مانند مثال قبلی و این بار از طریق Rest Request Body را با هم انجام می‌دهیم.

مقدمه ای بر query language در Elasticsearch

مثال اول:

در اینجا فیلد  برای سرچ کردن تمام documentها در یک index خاص است.

در قسمت بعدی عبارت  size را اضافه کرده و مقدار آن را برابر 1 قرار می‌دهیم. این کار باعث می‌شود تا صرفا یک document در  response بازگردانده شود.

مقدار size به صورت پیشفرض همیشه برابر 10 است. در این قسمت عبارت from  به این معنی است که مشخص شود که سرچ از کدام document شروع و با توجه به مقدار عبارت size، چه تعداد document برگشت داده شود. مقدار عبارت from به صورت پیشفرض برابر صفر است.

در request بالا، تمامی document ها به شکل نزولی و توسط فیلد balance برگشت داده می‌شوند. تا این قسمت با چند پارامتر اولیه آشنا شدید و میتوانید از این پس سرچ‌های پیشرفته‌تری را انجام دهید. در مثال زیر مشاهده می‌کنید که با دو فیلد balance و account_number میتوانید request زیر را دریافت کنید.

request پس از اجرای فیلدها:

در این قسمت قصد داریم از یک query جدید به نام match استفاده کنیم.

فرض کنید میخواهیم یک document با account_number  برابر 20 را پیدا کنیم. به این منظور دستورات زیر را استفاده می‌کنیم.

Response این دستورات به صورت زیر خواهد بود.

همانطور که مشاهده می‌کنید، تنها یک document با account_number  برابر 20 است.

مثال دوم:

اجازه دهید یک مثال دیگر برای درک بهتر این موضوع را با هم بررسی کنیم. این بار از نمونه کد زیر استفاده می‌کنیم.

در این قسمت تمامی document هایی که در فیلد address دارای مقادیر mill و lane هستند، نمایش داده می‌شوند. برای اینکه مشخص کنیم document هایی که دقیقا شامل عبارت mill lane هستند، نمایش داده شوند، باید از یک query به نام match_phrase استفاده کنیم.

query دیگری به نام bool وجود دارد. وظیفه این query، نمایش تمامی query های کوچکتر در یک query بزرگتر است. این کار به وسیله منطقی به نام boolean انجام می‌شود. در مثال زیر با دو بار استفاده از match query، تمامی document هایی که شامل مقادیر mill و lane هستند، در فیلد address نمایش داده می‌شوند.

Response این دستورات به صورت زیر خواهد بود.

در اینجا به فیلد هایلایت شده address توجه کنید. این فیلد شامل هر دو مقدار mill و lane است. عبارت must  در request به معنای این است که گرفتن مقدار true برای هر دو query bool به منظور نمایش document  الزامی است.

در request بالا، یک query جدید به نام should را مشاهده می‌کنید. این query زمانی که مورد استفاده قرار بگیرد، در صورتی که فقط یکی از bool ها دارای مقدار true باشد، document را برگشت می‌دهد.

در نمونه کد بالا یک query جدید دیگر را نیز به نام must_not  مشاهده می‌کنید. این query زمانی که مورد استفاده قرار بگیرد، هیچ document ای حاوی مقادیر mill و lane در فیلد address را برنمی‌گرداند.

حال یک نمونه دیگر را بررسی می‌کنیم در این نمونه میخواهیم document هایی که مقادیر age برابر 40 دارند و state آنها برابر ID نیست، نمایش داده شود. به این منظور از کد زیر استفاده می‌کنیم.

اعمال فیلترها در Elasticsearch

به یاد دارید که در بخش the Search Api  از بررسی document score  صرف نظر کردیم. در این قسمت می‌خواهیم توضیحات مختصری را در رابطه با score در Elasticsearch به شما ارائه دهیم. score در Elasticsearch یک مقدار عددی است و بر اساس هماهنگی document  و query در  request  مقداردهی می‌شود. در بعضی از مواقع عملا مقدار دهی score فایده چندانی ندارد. به طور مثال سیستم Elasticsearch برای document ها، مقدار score خاصی تولید نمی‌کند زیرا این مقداردهی به score، در فیلتر کردن یک فیلد خاص در Elasticsearch ، عملا استفاده ای نخواهد داشت. در query bool که در بخش قبلی معرفی کردیم، از شرط filter برای اعمال فیلتر بر روی document ها استفاده می‌شود.

مثال:

در اینجا با یک مثال دیگر بحث را به پایان می‌رسانیم. در این مثال توسط query range، به وسیله range می‌توانیم، document ها را بر اساس مقادیر متفاوت یک فیلد فیلتر کنیم. از range query برای فیلتر کردن مقادیر عددی یا تاریخ استفاده می‌شود.

در مثال زیر account هایی با مقادیر balance بین 20000 تا 50000  نمایش داده می‌شود.

ارسال دیدگاه

3 + 4 =

در صورت نیاز و یا هر گونه مشکل ایمیل بزنید

پیام با موفقیت ثبت شد.
خطایی رخ داده است.