در این پست کمی دیگر به مبحث اسکریپت ها می پردازیم و Update ها، متغییر ها و...را تعریف میکنیم.
برای آپدیت کردن یک doc توسط اسکریپت ها از این کد استفاده می شود.
PUT my-index/_doc/1
{ "counter": 1, "tags": [
"red" ]}
POST my-index/_update/1
{
"script": {
"source": "ctx._source.counter += params.count",
"lang": "painless",
"params": {
"count": 4
}
}
}
در این کد یک doc با id 1 و با یک لیست color و یک counter 1 میسازیم.
در کد Update با زبان پینلس یک اسکریپت میزنیم و یک پارامتر کانت 4 به آن می پاسیم : دی
در کد، ctx به معنای کل doc است، _source فیلد های درون است و counter هم که
فیلد است.
در اینجا پارامتر کانت را به کانتر در داک اضافه کردیم.
نتیجه: کانتر برابر 5 می شود.
POST my-index/_update/1
{ "script": {
"source": "ctx._source.tags.add(params['tag'])",
"lang": "painless",
"params": {
"tag": "blue"
}}}
در این کد به آرایه colors مقدار blue اضافه می شود، add برای افزودن مقدار به آرایه در java و painless استفاده می شود.
برای حذف تگ نیز از این کد استفاده کنید:ctx._source.tags.remove(ctx._source.tags.indexOf(params['tag']))
برای دیگر کد ها میتوانید سرچ کنید یا به داکیومنت java و painless مراجعه کنید
برای افزودن یک فیلد به داک نیز از اسکریپت زیر استفاده کنید.
POST my-index/_update/1
{ "script" : "ctx._source.new_field = 'value_of_new_field'"}
در اینجا یک فیلد new_field با مقدار value_of_new_field افزوده شده است.
برای حذف هم: "ctx._source.remove('new_field')
و یک کد پیشرفته تر:
if (ctx._source.tags.contains(params['tag'])) { ctx.op = 'delete' } else { ctx.op = 'none' }
در این کد در صورتی که tag ها شامل پارامتر تگ بشوند، ctx.op که مخفف opration
است، را به delete تغییر می دهیم، یعنی عملیات دیلیت را بر روی آن چیز انجام میدهیم.
یا در غیر این صورت هیچ کاری نمی کنیم.
برای تعریف یک متغیر در painless به این صورت عمل کنید.
POST my-index/_update/1
{ "script": {
"source": "String newVar = 'HI!'; ctx._source.message = newVar + params[tag]",
"lang": "painless",
"params": { "tag": "blue" }}}
اول dataType را مینویسیم و سپس مقدار را به آن می دهیم.
POST mainindex/_update_by_query
{
"script": {
"source": "ctx._source.allwords = ctx._source.allwords.replace('–', ';');ctx._source.allwords = ctx._source.allwords.replace('–', ';');ctx._source.allwords = ctx._source.allwords.replace('،', ';');ctx._source.allwords = ctx._source.allwords.replace(',', ';');",
"lang": "painless"
},
"query": {
"bool": {
"must": [{
"exists": {
"field":"allwords"}}],
"must_not": [
{
"bool": {
"should": [
{
"term": {
"allwords.keyword": {
"value": "" }}},{
"term": {
"allwords.keyword": {
"value": "" }}}]}}]}}}
ممکن است درک این کد کمی سخت باشد، اما با چند بار خواندن و بررسی کردن، میتوان به خوبی آن را درک کرد.
اول:
کوئری میگوید هر جا که فیلد allwords خالی نباشد و allwords.keyword
نیز وجود داشته باشد و مساوی با ; نباشد، این کد یک کد مخصوص برنامه نویسی داده است، در این کد هدف ما جایگزینی ویرگول، کاما و خط فاصله با ویرگول است تا هنگام پردازش دچار مشکل نشویم.
در این پروژه قبلا پردازش هایی صورت گرفته بود و ممکن بود فیلد allword.keyword مساوی با ; شده باشد
POST my-index/_update_by_query
{
"script": {
"source": "ctx._source.color.add('pink') ",
"lang": "painless"
},
"query": {
"bool": {
"must": [
{
"exists": {
"field": "color" }}]}}}
POST my-index/1/_update_by_query
{
"script": {
"source": "ctx._source.array.add(['entity_id' :1, 'entity_title' : 'Title,'realation_type' : 'realation_type']); ",
"lang": "painless"
}
}
این هم یک آرایه از آبجکت ها ایجاد میکند.
POST my-index/1/_update_by_query
{
"script": {
"source": "try {String year = ''; if(ctx._source.eb_year != null) year =ctx._source.eb_year.trim().replace('/', '').replace('هـ', ''); int d = Integer.parseInt(year);ctx._source.eb_year = d;} catch (NumberFormatException nfe) {ctx._source.remove('eb_year'); }",
"lang": "painless" }}
این اسکریپت در صورتی که فیلد eb_year int نباشد آن را حذف میکند.
POST mainindex/_update_by_query
{
"script": {
"source": " String allwords = ctx._source.allwords; def a_chars = allwords.toCharArray(); int chars_len = a_chars.length; ArrayList result = new ArrayList(); int last_dot = chars_len; for(int i = chars_len -1; i>=-1; i--) { if (i == -1 || a_chars[i] == (char) ';' ){ String t1 = allwords.substring(i+ 1, last_dot).trim(); if(t1 != '') result.add(t1); last_dot = i; } } ctx._source.tags = result; ",
"lang": "painless"
},
"query": {
"bool": {
"must": [
{
"exists": {
"field":"allwords" }}],
"must_not": [
{
"bool": {
"should": [
{
"term": {
"allwords.keyword": {
"value": "" }}},{
"term": {
"allwords.keyword": {
"value": "" }}}]}}]}}}
اگر فیلد allword (دوباره :دی) وجود داشته باشد این کد اجرا می شود.
String allwords = ctx._source.allwords; def a_chars = allwords.toCharArray(); int chars_len = a_chars.length;
این کد chars_len را برابر با تعداد کاراکتر های allwords میکند، دیگر آن را توضیح نمیدهم، میتوانید به داکیومنت آن مراجعه کنید.
کل این کد allwords را میخواند و با ; اسپلیت می کند و در آرایه result ذخیره میکند.
جلسه ی بعد
❤️💬
پ.ن: اگر کد ها اذیتتون کردن واقعا عذر می خوام، نحوه نمایش کد ها اصلا درست نیست - البته تقصیر منم نیست و تقصیر ویرگوله!