官方7.9版本:https://www.elastic.co/guide/en/elasticsearch/reference/7.9/modules-scripting.html
通過ES腳本來解決,其允許用戶在一些特定的API中對自定義表達式進行求值。
版本 | 使用腳本 |
---|---|
< Elasticsearch 1.4 | MVEL 腳本 |
< Elasticsearch 5.0 | Groovy 腳本 |
‘>= Elasticsearch 5.0 | painless 腳本 |
Painless是一種簡單,安全的腳本語言,專為與Elasticsearch一起使用而設計。它是Elasticsearch的默認腳本語言,可以安全地用于內聯和存儲腳本。
Painless特點:
性能優秀:Painless腳本運行速度比備選方案(包括Groovy)快幾倍。
安全性強:使用白名單來限制函數與字段的訪問,避免了可能的安全隱患。
可選輸入:變量和參數可以使用顯式類型或動態def類型。
上手容易:擴展了java的基本語法,并兼容groove風格的腳本語言特性。
特定優化:是ES官方專為Elasticsearch腳本編寫而設計。
增刪改查能解決業務場景80%的問題,Painless腳本操作一般應用于相對復雜的業務場景中。
自定義字段
自定義評分
自定義更新
自定義reindex
聚合
其他自定義操作
在update,update-by-query,或reindexAPI中使用腳本時,需要通過ctx去訪問文檔中的字段。ctx._source:訪問文檔_source字段ctx.op:對文檔對應的操作,包括index和deletectx._index:訪問文檔的meta-fields其他字段或變量的訪問見:updatecontext
"script":{"lang":"...",#代表language腳本語言,默認指定為:painless"source"|"id":"...",#腳本的核心部分,id應用于:storedscript"params":{...}#傳遞給腳本使用的變量參數}
如:需要給每個doc的complexrank字段翻倍并返回翻倍后的值
POSTsphinx-doctor/_search{"from":0,"size":20,"query":{"match_all":{}},"_source":"complexrank","script_fields":{"custom_field":{"script":{"lang":"expression",#這里腳本語言選擇的expression"source":"doc['complexrank']*multiplier","params":{"multiplier":2}}}}}說明:對原索引中的complexrank字段值進行2倍返回給custom_field字段{"took":20,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":194354,"max_score":1,"hits":[{"_index":"sphinx-doctor-20.11.06-103145","_type":"_doc","_id":"740","_score":1,"_source":{"complexrank":"5985"},"fields":{"custom_field":[11970]}},{"_index":"sphinx-doctor-20.11.06-103145","_type":"_doc","_id":"742","_score":1,"_source":{"complexrank":"5325"},"fields":{"custom_field":[10650]}}]}}
如:返回日期字段中的“年”或“月”或“日”等
POSTdrug/_search{"from":0,"size":20,"query":{"match_all":{}},"script_fields":{"custom_field":{"script":{"source":"doc.ctime.value.year"#月:month}}}}{"took":57,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":173536,"max_score":1,"hits":[{"_index":"drug-20.12.03-151452","_type":"_doc","_id":"1883795984","_score":1,"fields":{"custom_field":[2014]}},{"_index":"drug-20.12.03-151452","_type":"_doc","_id":"1883795985","_score":1,"fields":{"custom_field":[2014]}}]}}
POSTsphinx-doctor/_search{"from":0,"size":2,"_source":"hospitalname","query":{"function_score":{"query":{"match":{"hospitalname":{"query":"北京協和醫院"}}},"functions":[{"filter":{"match_all":{"boost":1}},"script_score":{"script":{"source":"_score*params._score+doc['rank'].value*params.rank+doc['adminlevel'].value*params.adminlevel","lang":"painless",##是Lucene’sexpressions腳本語言"params":{"adminlevel":2500,"rank":0.5,"_score":1}}}}],"score_mode":"sum","max_boost":3.4028235e+38,"boost":1}},"track_scores":true}{"took":487,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":777965,"max_score":449721.3,"hits":[{"_index":"sphinx-doctor-20.12.09-010000","_type":"_doc","_id":"175477","_score":449721.3,"_source":{"hospitalname":"北京協和醫院"}},{"_index":"sphinx-doctor-20.12.09-010000","_type":"_doc","_id":"221609","_score":440269.34,"_source":{"hospitalname":"北京協和醫院"}}]}}JavaAPI:排序StringscriptText="_score*params._score+doc['rank'].value*params.rank+doc['adminlevel'].value*params.adminlevel";Map<String,Object>params=newHashMap<>();params.put("_score",1.0f);params.put("rank",0.5f);params.put("adminlevel",2500f);Scriptscript=newScript(ScriptType.INLINE,"painless",scriptText,params);ScriptScoreFunctionBuilderscriptScoreFunctionBuilder=ScoreFunctionBuilders.scriptFunction(script);FunctionScoreQueryBuilderfunctionScoreQueryBuilder=QueryBuilders.functionScoreQuery(boolQueryBuilder,scriptScoreFunctionBuilder).scoreMode(FunctionScoreQuery.ScoreMode.SUM);builder.query(functionScoreQueryBuilder);builder.from(offset);builder.size(limit);//當使用排序_sort來指定依據某些字段排序。就不會計算得分,需要設置"track_scores":true,這樣分數就會被計算和跟蹤。builder.trackScores(true);
update:將已有字段值賦值給其他字段。
POSTsphinx-doctor/_doc/102647/_update{"script":{"lang":"painless","source":"ctx._source.hospitalname=params.hospitalname;ctx._source.name=params.name","params":{"hospitalname":"北京協和醫院","name":"協和醫生"}}}
update_by_query
POSTsphinx-doctor/_update_by_query{"query":{"term":{"id":{"value":"102647"}}},"script":{"lang":"painless","source":"""if(ctx._source.registerordercount>=500){ctx._source.registerordercount+=200;}else{ctx.op=1000;}"""}}
POST_reindex{"source":{"index":"sphinx-doctor-20.12.02-150616","size":4000},"dest":{"index":"sphinx-doctor-20.12.03-151452"},"script":{"source":"ctx._source.complexrank+=10;\nctx._source.netcaseprice=100;"}}
POSTsphinx-doctor/_search{"from":0,"size":20,"query":{"match":{"hospitalname":"北京協和醫院"}},"aggs":{"grade":{"terms":{"script":{"source":"doc['grade.keyword'].value","lang":"painless"}}}}}{"took":187,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":193445,"max_score":44.18691,"hits":[{"_index":"sphinx-doctor-20.11.06-103145","_type":"_doc","_id":"30626487346","_score":44.18691,"_source":{"registerordercount":0,"hospitalfacultyname":"神經內科","idx_doctoridprimary":"DoctorIdPrimary_335","hospitaldistrict":"東城","caseopened":true,"isonline":null,"dummy":"SELECT_ALL","facultyid":"1007000","price":"10","rank":"0","ctime":"1568269475","id":"30626487346","clinicprice":"20.00","idx_hospitalfacultyid":"HospitalFacultyId_335","educategrade":"","adminlevel":"1","isprimarydoctor":1,"isexpert":true,"bookingvisitnum":0,"primaryid":"30626487346","hospitalfacultyid":"335","spaceid":"200007660088","hospitalcity":"北京","isopenvideo":true,"grade":"主任醫師","name":"30626487346","idx_fix_bigcity":"北京協和醫院北京協和醫院北京協和醫院北京協和醫院測試用","phoneopened":true,"onlineschedule":"20201207,20201214,20201221","isvideotpl":false,"issanjia":true,"hospitalprovince":"北京","servicelevel":2,"title":"","confirmed":"1","isvip":false,"general":0,"menzhenprice":"10","isopencosvideo":false,"hospitalname":"北京協和醫院北京協和醫院北京協和醫院北京協和醫院測試用","netcaseprice":"20.00","registrprice":0,"free":0,"workstatus":"0","registtationopened":null,"indextype":"doctor","utime":1606978403,"complexrank":"5985","sex":"1","reservationopened":null,"idx_doctorid":"DoctorId_30626487346","idx_hospital_info":"北京協和醫院北京協和醫院北京協和醫院北京協和醫院測試用,北京協和醫院,33北京協和醫院,協和醫院,協和東院,協和東院區,北京協和醫院東院,協和西院,北京郵電總醫院,郵電總醫院,北京協和西院,北京協和醫院西院區,北京協和醫院西院,北京協和,北京市協和,北京郵電醫院,協合醫院,北京市協和醫院,中國醫學科學院北京協和醫院,北京協合醫院45,協和醫院,北京協和,北京市協和,協和東院,北京協和醫院東院,協和西院,北京郵電醫院,北京協和西院,北京協和醫院西院,協合醫院,北京市協和醫院,中國醫學科學院北京協和醫院,北京協合醫院","isopenrecipe":false,"hits":"0","iscosmetologydoctor":null,"hospitalid":"1","idx_facultyid":"FacultyId_1007000","activitytime":"1568269520","hospitalgrade":"6","idx_hospitalid":"HospitalId_1","username":"francoliu"}},{"_index":"sphinx-doctor-20.11.06-103145","_type":"_doc","_id":"310346050824","_score":40.138744,"_source":{"registerordercount":0,"hospitalfacultyname":"心血管內科","idx_doctoridprimary":"DoctorIdPrimary_341","hospitaldistrict":"東城","caseopened":false,"isonline":null,"dummy":"SELECT_ALL","facultyid":"1010000","price":0,"rank":"0","ctime":"1605859848","id":"310346050824","clinicprice":0,"idx_hospitalfacultyid":"HospitalFacultyId_341","educategrade":"教授","adminlevel":"4","isprimarydoctor":1,"isexpert":true,"bookingvisitnum":0,"primaryid":"310346050824","hospitalfacultyid":"341","spaceid":"0","hospitalcity":"北京","isopenvideo":null,"grade":"主任醫師","name":"地名","idx_fix_bigcity":"北京協和醫院","phoneopened":false,"onlineschedule":"","isvideotpl":false,"issanjia":true,"hospitalprovince":"北京","servicelevel":0,"title":"","confirmed":"","isvip":false,"general":0,"menzhenprice":0,"isopencosvideo":false,"hospitalname":"北京協和醫院","netcaseprice":0,"registrprice":0,"free":0,"workstatus":"0","registtationopened":null,"indextype":"doctor","utime":1605859882,"complexrank":"0","sex":"1","reservationopened":null,"idx_doctorid":"DoctorId_310346050824","idx_hospital_info":"北京協和醫院,北京協和醫院,33北京協和醫院,協和醫院,協和東院,協和東院區,北京協和醫院東院,協和西院,北京郵電總醫院,郵電總醫院,北京協和西院,北京協和醫院西院區,北京協和醫院西院,北京協和,北京市協和,北京郵電醫院,協合醫院,北京市協和醫院,中國醫學科學院北京協和醫院,北京協合醫院45,協和醫院,北京協和,北京市協和,協和東院,北京協和醫院東院,協和西院,北京郵電醫院,北京協和西院,北京協和醫院西院,協合醫院,北京市協和醫院,中國醫學科學院北京協和醫院,北京協合醫院","isopenrecipe":null,"hits":"0","iscosmetologydoctor":null,"hospitalid":"1","idx_facultyid":"FacultyId_1010000","activitytime":null,"hospitalgrade":"6","idx_hospitalid":"HospitalId_1","username":""}}]},"aggregations":{"grade":{"doc_count_error_upper_bound":0,"sum_other_doc_count":479,"buckets":[{"key":"主任醫師","doc_count":77699},{"key":"副主任醫師","doc_count":72939},{"key":"主治醫師","doc_count":20399},{"key":"","doc_count":13558},{"key":"住院醫師","doc_count":5731},{"key":"副主任技師","doc_count":896},{"key":"副主任藥師","doc_count":612},{"key":"主管技師","doc_count":468},{"key":"主任藥師","doc_count":355},{"key":"副主任檢驗師","doc_count":309}]}}}
兩個或多個字段進行運算返回一個值進行排序
POSTsphinx-doctor/_search{"_source":["clinicprice","menzhenprice"],"query":{"match_all":{}},"sort":{"_script":{"type":"number",#string"order":"desc","script":{"lang":"painless","source":"doc['clinicprice'].value+doc['menzhenprice'].value"}}}}{"took":334,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":782852,"max_score":null,"hits":[{"_index":"sphinx-doctor-20.12.09-010000","_type":"_doc","_id":"102647","_score":null,"_source":{"menzhenprice":"1400","clinicprice":"2700.00"},"sort":[4100.0]},{"_index":"sphinx-doctor-20.12.09-010000","_type":"_doc","_id":"8231","_score":null,"_source":{"menzhenprice":"2000.00","clinicprice":"2000.00"},"sort":[4000.0]}]}}
邏輯運算符進行判斷來影響排序
POSTsphinx-doctor/_search{"_source":["clinicprice","menzhenprice"],"from":0,"size":2,"query":{"match_all":{}},"sort":[{"complexrank":{"order":"desc"}},{"_script":{"script":{"inline":"'北京'==doc['hospitalprovince.keyword'].value?0:('陜西'==doc['hospitalprovince.keyword'].value?1:2)"},"type":"number","order":"asc"}}]}{"took":80,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":782852,"max_score":null,"hits":[{"_index":"sphinx-doctor-20.12.09-010000","_type":"_doc","_id":"5279893112","_score":null,"_source":{"menzhenprice":"500","clinicprice":0},"sort":[981,2.0]},{"_index":"sphinx-doctor-20.12.09-010000","_type":"_doc","_id":"124096","_score":null,"_source":{"menzhenprice":"200.00","clinicprice":"200.00"},"sort":[980,2.0]}]}}
到此,關于“Scripting腳本的介紹和使用方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注本站網站,小編會繼續努力為大家帶來更多實用的文章!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
安卓手機怎么設置黑名單不提醒,安卓手機怎么設置黑名單這個很多人還不知道,現在讓我們一起來看看吧!1、若使用vivo手機,可進入手機電話/聯系人--長按某個號碼--(更多)--加入黑名單即可。2、聯系人添加到黑名單后,如該聯系人給自己撥打電話,則會有“您撥叫的用戶正忙,請您稍后再撥“的提示。(資料圖)3、當將某個聯系人加入黑名單后,此聯系人的來電、發的短信都將被攔截。4、目前有三種辦法:一、手機自帶...
征信報告次級抵押貸款也做不了嗎?若準備在招行申請個人貸款,“征信記錄” 會作為審核的重要選項之一。最終審核是.否能夠通過,是結合您申請的業務品種、個人償付能力、信用狀況等因素進行綜合評定的,需要經辦網點審批后才能確定。建議您提供相關申請材料,聯系當地網點的個貸部門進一步核實。征信次級是不是永遠不能貸款?一般來說,銀行會根據借款人的還款能力,將貸款劃分為正常、關注、次級、可疑...
什么是代扣代繳?代扣手續費是什么意思?銀行代扣需要收手續費嗎?小編整理如下代扣代繳是指按照稅法規定,負有扣繳稅款義務的單位和個人,負責對納稅人應納的稅款進行代扣代繳的一種方式。即由支付人在向納稅人支付款項時,從所支付的款項中依法直接扣收稅款代為繳納。其目的是對零星分散、不易控制的稅源實行源泉控制。代扣手續費是什么意思?代扣代繳手續費是指代扣代繳稅款的手續費。企業代扣代繳的個人所得稅、代非居民企業繳...