تصمیم گرفتم مبحث آنالایزر ها را برای بعد بذارم، در این پست هایلایت، چند ریزه کاری و کمی اسکریپت نویسی یاد خواهیم گرفت.
اولین مبحثی که در مورد آن صحبت میکنیم highlight است، هایلایت، در سرچ مورد استفاده قرار می گیرد، حتما در سایت های مختلف دیده اید که هنگامی که یک متن را جستجو میکنید، متن هایی که در رابطه با آن پیدا شدند رنگ خاصی پیدا میکنند.
برای هایلایت میتوانید بعد از زدن search query هایلایت را نیز تعریف کنید.
به عنوان مثال:
GET qanonindex-v03/_search
{
"size": 4,
"from": 0,
"_source": [
"ref_con"
],
"query": {
"bool": {
"should": [
{
"match_phrase": {
"content": {
"query": "سبک زندگی اسلامی",
"boost": 10
}
}
},
{
"match": {
"content": "سبک زندگی اسلامی"
}
}
]
}
},
"highlight": {
"fields": {
"content": {}
}
}
}
این کد یک نمونه کد نیست و یک کد واقعی است که در یکی از پروژه هایم استفاده کرده بودم
همه رو توضیح دادیم ولی باز یک مروری می کنیم.
در این کد 4 تا match اول برای فیلد ref_con که در کانتنتش اگر دقیقا "سبک زندگی اسلامی"
بود، 10 امتیاز و اگر کلا سبک زندگی اسلامی بود 1 امتیاز به هر کدام بدهد.
و اما هایلایت
یک فیچر هایلایت داریم که تنظیمات خاصی ندارد، این به صورت پیشفرض (میخواستم بگم دیفالت) هر متنی که در ref_con باشد و Match باشد را بین دو تگ html em قرار میدهد (یک تگ باز و یک بسته)
و در fields, content نیز مشخص شده است تا highlight در content انجام شود.
"highlight": {
"pre_tags": [
"<span class='text__orange'>"
],
"post_tags": [
"</span>"
],
"fields": {
"content": {}
},
}
احتمالا خودتان 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
{
"script": {
"lang": "painless",
"source": "Math.log(_score * 2) + params['my_modifier']"
}
}
الاستیک یک ایندکس پیشفرض برای اسکریپت ها دارد، این اییندکس را نباید delete کنید.
این ایندکس برای ذخیره اسکریپت ها برای استفاده های بعدی استفاده می شود، این یک ایندکس کاربردی است و الان کار با آن را یاد خواهیم گرفت.
در اینجا ما یک اسکریپت به نام calculate-score
ذخیره کرده ایم.
این اسکریپت در زبان painless نوشته شده و و یک پارامتر و امتیاز یک سرچ را می گیرد و لوگاریتم امتیاز ضرب بر 2 بعلاوه پارامتر my_modifier
را برمی گرداند.
برای دیدن اسکریپت میتوانید از کد زیر استفاده کنید.
GET _scripts/calculate-score
از این اسکریپت میتوان به این صورت استفاده کرد:
GET my-index/_search
{
"query": {
"script_score": {
"query": {
"match": {
"my_field": 5
}
},
"script": {
"id": "calculate-score", // id of saved script
"params": {
"my_modifier": 2
}
}
}
}
}
در این کد ما اسکریپت ذخیره شده را روی score اجرا کرده ایم(script_score
) اجرا کردیم و اسکور را به نتیجه این اسکریپت تغییر دادیم.
و به به عنوان پارامتر my_modifier
دو را به آن داده ایم.
برای حذف اسکریپت هم از این کد استفاده کنید.
DELETE _scripts/calculate-score
تا یادم نرفته این را هم بگویم که برای افزودن آرایه به یک ایندکس از این راه استفاده کنید:
POST my-index/_doc/1
{
"colors": [
"blue",
"red",
"green",
"yellow"
]
}
خودم میدونم که این هیچ ربطی نداشت ولی یادم رفته بود بگم : دی
جلسه ی بعد
❤️💬