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

در این پست کمی دیگر به مبحث اسکریپت ها می پردازیم و Update ها، متغییر ها و...را تعریف میکنیم.آپدیتفیلدبرای آپدیت کردن یک doc توسط اسکریپت ها از این کد استفاده می شود.PUT my-index/_doc/1 { &quotcounter&quot: 1, &quottags&quot: [ &quotred&quot ]} POST my-index/_update/1 { &quotscript&quot: { &quotsource&quot: &quotctx._source.counter += params.count&quot, &quotlang&quot: &quotpainless&quot, &quotparams&quot: { &quotcount&quot: 4 } } }در این کد یک doc با id 1 و با یک لیست color و یک counter 1 میسازیم.در کد Update با زبان پینلس یک اسکریپت میزنیم و یک پارامتر کانت 4 به آن می پاسیم : دیدر کد، ctx به معنای کل doc است، _source فیلد های درون است و counter هم که فیلد است.در اینجا پارامتر کانت را به کانتر در داک اضافه کردیم.نتیجه: کانتر برابر 5 می شود.آرایه POST my-index/_update/1 { &quotscript&quot: { &quotsource&quot: &quotctx._source.tags.add(params['tag'])&quot, &quotlang&quot: &quotpainless&quot, &quotparams&quot: { &quottag&quot: &quotblue&quot }}}در این کد به آرایه colors مقدار blue اضافه می شود، add برای افزودن مقدار به آرایه در java و painless استفاده می شود.برای حذف تگ نیز از این کد استفاده کنید:ctx._source.tags.remove(ctx._source.tags.indexOf(params['tag']))برای دیگر کد ها میتوانید سرچ کنید یا به داکیومنت java و painless مراجعه کنیدبرای افزودن یک فیلد به داک نیز از اسکریپت زیر استفاده کنید.POST my-index/_update/1{ &quotscript&quot : &quotctx._source.new_field = 'value_of_new_field'&quot}در اینجا یک فیلد 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{ &quotscript&quot: { &quotsource&quot: &quotString newVar = 'HI!'; ctx._source.message = newVar + params[tag]&quot, &quotlang&quot: &quotpainless&quot, &quotparams&quot: { &quottag&quot: &quotblue&quot }}}اول dataType را مینویسیم و سپس مقدار را به آن می دهیم.بررسی چند اسکریپتاسکریپت اول POST mainindex/_update_by_query { &quotscript&quot: { &quotsource&quot: &quotctx._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(',', ';');&quot, &quotlang&quot: &quotpainless&quot }, &quotquery&quot: { &quotbool&quot: { &quotmust&quot: [{ &quotexists&quot: { &quotfield&quot:&quotallwords&quot}}], &quotmust_not&quot: [ { &quotbool&quot: { &quotshould&quot: [ { &quotterm&quot: { &quotallwords.keyword&quot: { &quotvalue&quot: &quot&quot }}},{ &quotterm&quot: { &quotallwords.keyword&quot: { &quotvalue&quot: &quot&quot }}}]}}]}}}ممکن است درک این کد کمی سخت باشد، اما با چند بار خواندن و بررسی کردن، میتوان به خوبی آن را درک کرد.اول:کوئری میگوید هر جا که فیلد allwords خالی نباشد و allwords.keyword نیز وجود داشته باشد و مساوی با ; نباشد، این کد یک کد مخصوص برنامه نویسی داده است، در این کد هدف ما جایگزینی ویرگول، کاما و خط فاصله با ویرگول است تا هنگام پردازش دچار مشکل نشویم.در این پروژه قبلا پردازش هایی صورت گرفته بود و ممکن بود فیلد allword.keyword مساوی با ; شده باشداسکریپت دومPOST my-index/_update_by_query { &quotscript&quot: { &quotsource&quot: &quotctx._source.color.add('pink') &quot, &quotlang&quot: &quotpainless&quot }, &quotquery&quot: { &quotbool&quot: { &quotmust&quot: [ { &quotexists&quot: { &quotfield&quot: &quotcolor&quot }}]}}}اسکریپت سوم POST my-index/1/_update_by_query { &quotscript&quot: { &quotsource&quot: &quotctx._source.array.add(['entity_id' :1, 'entity_title' : 'Title,'realation_type' : 'realation_type']); &quot, &quotlang&quot: &quotpainless&quot } }این هم یک آرایه از آبجکت ها ایجاد میکند.اسکریپت چهارمPOST my-index/1/_update_by_query { &quotscript&quot: { &quotsource&quot: &quottry {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'); }&quot, &quotlang&quot: &quotpainless&quot }}این اسکریپت در صورتی که فیلد eb_year int نباشد آن را حذف میکند.و آخرین اسکریپت POST mainindex/_update_by_query { &quotscript&quot: { &quotsource&quot: &quot 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; &quot, &quotlang&quot: &quotpainless&quot }, &quotquery&quot: { &quotbool&quot: { &quotmust&quot: [ { &quotexists&quot: { &quotfield&quot:&quotallwords&quot }}], &quotmust_not&quot: [ { &quotbool&quot: { &quotshould&quot: [ { &quotterm&quot: { &quotallwords.keyword&quot: { &quotvalue&quot: &quot&quot }}},{ &quotterm&quot: { &quotallwords.keyword&quot: { &quotvalue&quot: &quot&quot }}}]}}]}}}اگر فیلد allword (دوباره :دی) وجود داشته باشد این کد اجرا می شود.String allwords = ctx._source.allwords; def a_chars = allwords.toCharArray(); int chars_len = a_chars.length;این کد chars_len را برابر با تعداد کاراکتر های allwords میکند، دیگر آن را توضیح نمیدهم، میتوانید به داکیومنت آن مراجعه کنید.کل این کد allwords را میخواند و با ; اسپلیت می کند و در آرایه result ذخیره میکند.❤️💬پ.ن: کسی میدونه چرا یک code توی ویرگول درست نمایش داده نمیشه و باید چی کار کرد؟