Indexing/Replacing Documents در Elasticsearch

من ارسلان میربزرگی، قصد دارم در این مقاله شما را با نحوه مدیریت دیتاها در Elasticsearch آشنا کنم. در پارت قبل، در مورد ساخت index صحبت کردیم.
اگر قسمت اول رو نخوندین، پیشنهاد میکنم اول قسمت اول رو بخونید:

قسمت اول

 

مثال اول :

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

elasticsearch

 

elasticsearch

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

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

elasticsearch3

elasticsearch4

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

elasticsearch5

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

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

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

elasticsearch6

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

elasticsearch7

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

elasticsearch8

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

elasticsearch9

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

elasticsearch10

پاک کردن   Document ها  در Elasticsearch

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

elasticsearch10

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

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

elasticsearch12

13elasticsearch

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

elasticsearch14

لود کردن دیتای نمونه در 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 به صورت زیر دریافت خواهید کرد.

elasticsearch15

The Search Api در Elasticsearch

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

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

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

elasticsearch17

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

elasticsearch18

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

took :

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

timed_out :

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

shards_ :

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

hits :

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

hits.total :

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

hits.hits :

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

hits.sort:

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

 

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

elasticsearch19

 

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

مثال :

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

elasticsearch20

 

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

elasticsearch21

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

elasticsearch22

elasticsearch22

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

elasticsearch24

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

elasticsearch25

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

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

elasticsearch

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  نمایش داده می‌شود.

ارسال دیدگاه

− 5 = 5

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

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