Ali Zeiynali
Ali Zeiynali
خواندن ۵ دقیقه·۱ سال پیش

هر آنچه باید در مورد دیتابیس الاستیک سرچ بدانید - 4

elsticsearch DATABASE
elsticsearch DATABASE

تصمیم گرفتم مبحث آنالایزر ها را برای بعد بذارم، در این پست هایلایت، چند ریزه کاری و کمی اسکریپت نویسی یاد خواهیم گرفت.

highlight

اولین مبحثی که در مورد آن صحبت میکنیم highlight است، هایلایت، در سرچ مورد استفاده قرار می گیرد، حتما در سایت های مختلف دیده اید که هنگامی که یک متن را جستجو میکنید، متن هایی که در رابطه با آن پیدا شدند رنگ خاصی پیدا میکنند.

برای هایلایت میتوانید بعد از زدن search query هایلایت را نیز تعریف کنید.

به عنوان مثال:

GET qanonindex-v03/_search
{
&quotsize&quot: 4,
&quotfrom&quot: 0,
&quot_source&quot: [
&quotref_con&quot
],
&quotquery&quot: {
&quotbool&quot: {
&quotshould&quot: [
{
&quotmatch_phrase&quot: {
&quotcontent&quot: {
&quotquery&quot: &quotسبک زندگی اسلامی&quot,
&quotboost&quot: 10
}
}
},
{
&quotmatch&quot: {
&quotcontent&quot: &quotسبک زندگی اسلامی&quot
}
}
]
}
},
&quothighlight&quot: {
&quotfields&quot: {
&quotcontent&quot: {}
}
}
}
این کد یک نمونه کد نیست و یک کد واقعی است که در یکی از پروژه هایم استفاده کرده بودم

همه رو توضیح دادیم ولی باز یک مروری می کنیم.

در این کد 4 تا match اول برای فیلد ref_con که در کانتنتش اگر دقیقا "سبک زندگی اسلامی" بود، 10 امتیاز و اگر کلا سبک زندگی اسلامی بود 1 امتیاز به هر کدام بدهد.

و اما هایلایت

یک فیچر هایلایت داریم که تنظیمات خاصی ندارد، این به صورت پیشفرض (میخواستم بگم دیفالت) هر متنی که در ref_con باشد و Match باشد را بین دو تگ html em قرار میدهد (یک تگ باز و یک بسته)

و در fields, content نیز مشخص شده است تا highlight در content انجام شود.

&quothighlight&quot: {
&quotpre_tags&quot: [
&quot<span class='text__orange'>&quot
],
&quotpost_tags&quot: [
&quot</span>&quot
],
&quotfields&quot: {
&quotcontent&quot: {}
},
}

احتمالا خودتان pre_tags , post_tags را حدس زده اید، تگ قبل از متن و تگ بعد از متن، شما میتوانید به دلخواه این را تغییر دهید.

و حالا به مبحث اسکریپت نویسی در elasticsearch میرسیم، میتوان گفت این مبحث بزرگترین مبحث الاستیک سرچ است و قابلیت های بسیار بسیار زیادی در اختیار ما قرار می دهد.

اسکریپت نویسی - آمادگی

زبان اسکریپت نویسی الاستیک

زبان اسکریپت نویسی الاستیک سرچ painless است، پین لس یک زبان برنامه نویسی مخصوص دیتابیس الاستیک سرچ است، این زبان بر پایه زبان برنامه نویسی Java نوشته شده و تقریبا از بسیاری از توابع Java استفاده میکند، برای یادگیری این زبان نیازی به یادگیری java نیست و در صورت نیاز به توابع Java میتوانید با یک سرچ، آن ها را پیدا کنید.

زبان Painless مستقیماً در بایت کد JVM کامپایل می شود تا از تمام بهینه سازی های ممکن که JVM ارائه می دهد، استفاده کند. همچنین، Painless معمولاً از ویژگی‌هایی که به بررسی‌های کندتر اضافی در زمان اجرا نیاز دارند، اجتناب می‌کند.

پینلس یک سینتکس را با آشنایی طبیعی برای هر کسی که تجربه اولیه کدنویسی دارد پیاده سازی می کند. Painless از زیرمجموعه ای از نحو جاوا با برخی بهبودهای اضافی برای افزایش خوانایی و حذف واضحات استفاده می کند.

امنیت

امنیت ایندکس شما از مهم ترین مسائل مورد نظر الاستیک است، به این منظور، Painless از یک لیست سفید مجاز با دقت بالا استفاده می‌کند که تا اعضای یک کلاس و توابع نیز به صورت دقیق در آن قرار گرفته اند. هر چیزی که جزء لیست مجاز نباشد، منجر به خطای کامپایل می‌شود. برای مشاهده لیست کاملی از کلاس‌ها، متدها و فیلدهای قابل دسترس در هر متن اسکریپتی، به مرجع API Painless مراجع کنید.

نحوه استفاده

پینلس در بخش source در بخش script نوشته می شود و میتوان یک سری متغیر ها را از doc به آن منتقل کرد.

استفاده

جستجو

در این کد اول یک my-index ساخته شده و در doc با id 1 یک my_field با مقدا 5 تعریف شده است.

اسکریپت نوشته شده در اینجا یک اسکریپت سرچ است، به این معنا که در راه سرچ استفاده می شود. :دی

اول از همه، گفته ایم که میخواهیم فیلد های اسکریپتی بنویسیم.

و بعد یک فیلد مجازی (به پست های قبل رجوع کنید) با نام my_doubled_fiel ایجاد کرده ایم و در آن یک اسکریپت زدیم.

اول از همه، در doc['my_field']داک به doc ای که گرفتیمش اشاره دارد، که اینجا تمامی داک ها را شامل می شود.

مای فیلد نیز همان فیلد تعریف شده است، اماparams['multiplier'] چیست؟
پارامس به مقادیری اشاره دارد که به script توسط params پاس داده شده است.
در اینجا ما multiplier را 2 قرار دادیم، و نتیجه 10 می شود.

ذخیره اسکریپت

POST _scripts/calculate-score
{
&quotscript&quot: {
&quotlang&quot: &quotpainless&quot,
&quotsource&quot: &quotMath.log(_score * 2) + params['my_modifier']&quot
}
}

الاستیک یک ایندکس پیشفرض برای اسکریپت ها دارد، این اییندکس را نباید delete کنید.
این ایندکس برای ذخیره اسکریپت ها برای استفاده های بعدی استفاده می شود، این یک ایندکس کاربردی است و الان کار با آن را یاد خواهیم گرفت.

در اینجا ما یک اسکریپت به نام calculate-score ذخیره کرده ایم.
این اسکریپت در زبان painless نوشته شده و و یک پارامتر و امتیاز یک سرچ را می گیرد و لوگاریتم امتیاز ضرب بر 2 بعلاوه پارامتر my_modifier را برمی گرداند.

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

GET _scripts/calculate-score

از این اسکریپت میتوان به این صورت استفاده کرد:

GET my-index/_search
{
&quotquery&quot: {
&quotscript_score&quot: {
&quotquery&quot: {
&quotmatch&quot: {
&quotmy_field&quot: 5
}
},
&quotscript&quot: {
&quotid&quot: &quotcalculate-score&quot, // id of saved script
&quotparams&quot: {
&quotmy_modifier&quot: 2
}
}
}
}
}

در این کد ما اسکریپت ذخیره شده را روی score اجرا کرده ایم(script_score) اجرا کردیم و اسکور را به نتیجه این اسکریپت تغییر دادیم.
و به به عنوان پارامتر my_modifier دو را به آن داده ایم.

حذف اسکریپت

برای حذف اسکریپت هم از این کد استفاده کنید.

DELETE _scripts/calculate-score

افزودن آرایه

تا یادم نرفته این را هم بگویم که برای افزودن آرایه به یک ایندکس از این راه استفاده کنید:

POST my-index/_doc/1
{
&quotcolors&quot: [
&quotblue&quot,
&quotred&quot,
&quotgreen&quot,
&quotyellow&quot
]
}

خودم میدونم که این هیچ ربطی نداشت ولی یادم رفته بود بگم : دی


جلسه ی بعد

https://virgool.io/@Ali_Z/%D9%87%D8%B1-%D8%A2%D9%86%DA%86%D9%87-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%DB%8C%DA%A9-%D8%B3%D8%B1%DA%86-%D8%A8%D8%AF%D8%A7%D9%86%DB%8C%D8%AF-5-szbgqiw7rcpd





❤️💬

الاستیک سرچبرنامه نویسیدیتابیسپایگاه دادهdata
یک برنامه نویس (نه چندان) نویسنده؟ https://coffeete.ir/Azeiynali
شاید از این پست‌ها خوشتان بیاید