要使用script腳本函數,需要在配置文件elasticsearch.yml中設置
計算機編程語言
腳本. disable_dynamic: false
關於elasticsearch script的文章總是會被無休止地修改。
ES支持更新,但是更新的方式是通過提供的腳本。ES做的是,通過
Index找到存儲記錄的對應節點,然後執行腳本,執行後返回新的索引。事實上,這是壹個獲取和重新索引的過程,其中,通過
版本控制不控制其他更新操作(此功能在0.19之後可用)。具體實施的原則應與elasticsearch壹致。
版本相關。
Get,reindex是指es先取出這條記錄,然後根據新數據生成壹條新記錄,再把新記錄放回ES中(不會覆蓋舊記錄)。
現在沒有數據。首先我們需要創建壹個記錄。
計算機編程語言
$ curl-XPUT localhost:9200/xiaorui . cc/blog/1-d ' {
【計數器】:1,
"標簽":["紅色"]
}'
$ curl-XPUT localhost:9200/xiaorui . cc/blog/1-d ' {
【計數器】:1,
"標簽":["紅色"]
}'
當直接修改數據時,必須註意直接更新將覆蓋以前的數據。另外,更新的時候需要/index/type/id,而且壹定要帶id。Elasticsearch不應該支持搜索查詢模式來更新修改後的數據。
計算機編程語言
curl-XPUT ' localhost:9200/xiaorui . cc/blog/1?漂亮的
{
【名稱】:" xiaorui.cc "
}'
curl-XPUT ' localhost:9200/xiaorui . cc/blog/1?漂亮的
{
【名稱】:" xiaorui.cc "
}'
Elasticsearch提供了本地更新參數doc,可以在本地修改,而不直接覆蓋之前的數據,會針對特定的k v字段進行修改。
計算機編程語言
curl-XPOST ' localhost:9200/xiaorui . cc/blog/1/_更新?漂亮的
{
" doc": { "name ":"瑞風雲" }
}'
curl-XPOST ' localhost:9200/xiaorui . cc/blog/1/_更新?漂亮的
{
" doc": { "name ":"瑞風雲" }
}'
當Elasticsearch API無法滿足需求時,Elasticsearch允許妳使用腳本來實現自己的邏輯。腳本支持許多API,比如搜索、排序、聚合和文檔更新。腳本可以作為請求的壹部分執行。腳本索引,或者從磁盤加載。
下面是es腳本的用法,是groovy開發的。下面的語句意味著將counter的值加4。
計算機編程語言
$ curl-XPOST ' localhost:9200/xiaorui . cc/blog/1/_ update '-d ' {
“腳本”:“ctx。_source.counter += count ",
" params" : {
【計數】:4
}
}'
$ curl-XPOST ' localhost:9200/xiaorui . cc/blog/1/_ update '-d ' {
“腳本”:“ctx。_source.counter += count ",
" params" : {
【計數】:4
}
}'
通過上面的例子,我們知道tags是壹個列表。如果您使用由doc在本地更新的語法,它將不能追加,或者它將覆蓋tags字段。那麽如何實現列表擴展呢?請使用elasticsearch腳本來實現。
計算機編程語言
$ curl-XPOST ' localhost:9200/xiaorui . cc/blog/1/_ update '-d ' {
“腳本”:“ctx。_source.tags += tag ",
" params" : {
【標簽】:“白色”
}
}'
$ curl-XPOST ' localhost:9200/xiaorui . cc/blog/1/_ update '-d ' {
“腳本”:“ctx。_source.tags += tag ",
" params" : {
【標簽】:“白色”
}
}'
_update還支持upsert功能。如果沒有該字段或關鍵字,將添加該記錄。這裏有壹個例子。如果沒有計數器字段,請插入它:
計算機編程語言
$ curl-XPOST ' localhost:9200/xiaorui . cc/blog/1/_ update '-d ' {
“腳本”:“ctx。_source.counter += count ",
" params" : {
【計數】:4
},
" upsert" : {
【專櫃】:1
}
}'
$ curl-XPOST ' localhost:9200/xiaorui . cc/blog/1/_ update '-d ' {
“腳本”:“ctx。_source.counter += count ",
" params" : {
【計數】:4
},
" upsert" : {
【專櫃】:1
}
}'
讓我們來看壹個更復雜的groovy腳本的用法。當妳的來源沒有關鍵的中國,那我就加個kv。
計算機編程語言
curl -XPOST "" -d "
{
“腳本”:“如果(!ctx。_ source . contains key(\ " China \ "){ CTX。_ source.attending = newField } ",
" params" : {"newField" : "blue" },
“我的字段”:“數據”
}'
curl -XPOST "" -d "
{
“腳本”:“如果(!ctx。_ source . contains key(\ " China \ "){ CTX。_ source.attending = newField } ",
" params" : {"newField" : "blue" },
“我的字段”:“數據”
}'
下面的腳本語法比較復雜,會遍歷壹組字典,然後進行判斷和賦值。
{
"55555″: 22,
【姓名】:“李四”,
" distr_pan": [
{
【k】:15,
【v】:15
},
{
“k”:20,
【v】:20
}
]
}
計算機編程語言
$ curl-XPUT ' localhost:9200/xiaorui . cc/blog/9123/_ update '-d '
{
“腳本”:“def x = falsectx。_ source . distr _ pan . each({ if(it . get(' k ')= = target){ x = true } });if(x){ctx。_source.distr_pan +=v} ",
" params":{
" v":{"k":nlp," v":35},
【目標】:15
}
}
$ curl-XPUT ' localhost:9200/xiaorui . cc/blog/9123/_ update '-d '
{
“腳本”:“def x = falsectx。_ source . distr _ pan . each({ if(it . get(' k ')= = target){ x = true } });if(x){ctx。_source.distr_pan +=v} ",
" params":{
" v":{"k":nlp," v":35},
【目標】:15
}
}
elasticsearch腳本到此為止,很多例子簡單明了…
腳本似乎不太安全。至少遠程代碼執行的漏洞已經暴露過好幾次了。下次嘗試python版本的腳本。
似乎對於我們來說,不管是groovy python,都沒什麽太大的,只是語法看起來壹樣。