elasticsearch Getting Started (四)-修改數據

@[ElasticSearch]

作者博客地址

原文鏈接(英文)

Elasticsearch提供準實時的數據操作和查詢能力。默認情況下,從你索引,刪除,更新數據到可以查詢之間有1s的延時(refresh interval),這是Elasticsearch和其他完成事務之後數據立即可用的平臺(例如SQL)之間最大的區別。

索引和替換數據

前文我們提到過如何索引一個單獨的索引,現在重新拿過來,如下所示:

curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
  "name": "John Doe"
}'

我們將數據索引到了指定的customer索引external類型的ID1中。接下來我們可以執行下面的命令,將新的文檔替換(reindex)掉原來已經存在的ID爲1的文檔:

curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
  "name": "Jane Doe"
}'

上面的命令將文檔中,ID爲1的nameJohn Doe替換成了Jane Doe,如果我們使用其他的ID而不是1的話,一條新的文檔將會索引到Elasticsearch,而原來的數據保持不變。

curl -XPUT 'localhost:9200/customer/external/2?pretty' -d '
{
  "name": "Jane Doe"
}'

上面的命令索引了一條數據到ID2中。

在索引數據過程中,ID是可選的,如果沒有指定的話,Elasticsearch會隨機生成一個ID,用這個ID去索引數據。不論是指定的還是自動生成的ID都會作爲數據索引的結果返回。

curl -XPOST 'localhost:9200/customer/external?pretty' -d '
{
  "name": "Jane Doe"
}'

注意在上面的命令中,我們使用了POST代替PUT,而且沒有指定ID。

更新文檔

除了可以索引和替換數據,我們也可以更新數據,但是Elasticsearch做不到在原來的數據中進行更新。當我們做更新操作時,Elasticsearch會刪除原來的數據,索引一個更新過數據的新的文檔到Elasticsearch中。

下面的命令更新了前文中我們的ID爲1的文檔,將name字段的值更改爲了Jane Doe

curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
  "doc": { "name": "Jane Doe" }
}'

下面的命令更新了前文中我們的ID爲1的文檔,將name字段的值更改爲了Jane Doe,同時添加了一個新的字段age

curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
  "doc": { "name": "Jane Doe", "age": 20 }
}'

還可以通過使用簡單的腳本來進行更新操作。下面的例子用腳本語言將age字段加了5:

curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
  "script" : "ctx._source.age += 5"
}'

上面例子中,ctx._source指定的是當前需要更新的文檔。

在本文完成時,更新操作只能一次在一條文檔中進行,以後Elasticsearch可能會提供更新多個文檔的能力,就像SQL中的UPDATE-WHERE語句。

刪除文檔

刪除文檔相當的簡單。下面的命令展示了怎樣刪除我們前文customer中ID爲2的文檔:

curl -XDELETE 'localhost:9200/customer/external/2?pretty'

delete-by-query插件可以指定查詢中所有的文檔。

批處理

除了可以對單個文檔進行索引,更新,刪除操作,Elasticsearch也提供了對多個文檔進行上述操作的批處理的能力。_bulk API提供了一種高效的機制進行快速的多個操作而且儘量少的進行網絡交換。

作爲一個簡單的例子,下面的命令可以使用一條bulk命令索引兩條數據:

curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
'

下面的例子在一條bulk操作中先更新了第一條文檔,然後刪除了第二條文檔:

curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
'

對於上面的刪除操作後面沒有指定的相應的文檔,因爲刪除操作只需要被刪除的文檔ID。

bulk操作會順序執行所有的actions。如果一個單個的操作失敗了,會繼續執行剩下的部分。在返回結果中,它會提供每個操作的執行狀態,順序跟執行順序相同,這樣就可以看到所有操作的執行狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章