當前位置:成語大全網 - 新華字典 - 說說elasticsearch是怎麽用的?

說說elasticsearch是怎麽用的?

今天我就來詳細說說elasticsearch的更新功能,以及如何利用腳本腳本來更新數據。

要使用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,都沒什麽太大的,只是語法看起來壹樣。