ES-刪除數據
- 刪除單個文檔或者一組文檔。這樣做的時候,ES只是將它們標記為刪除,所以它們不會再出現於搜索結果中,稍后ES通過異步的方式將它們徹底的從索引中移出。
- 刪除整個索引。這是刪除多組文檔的特例。但是不同點在於這樣做的性能更好。主要的工作就是移除和那個索引相關的所有文件,幾乎是瞬間就能完成。
- 關閉索引。關閉的索引不允許讀取或寫入操作,數據也不會加載到內存。這和刪除ES數據類似,但是索引還是保留在磁盤上。它也很容易恢復,主要再次打開關閉的索引。
刪除文檔
(1).通過ID刪除單個文檔。如果只有一篇文檔要刪除,而且知道要刪除的ID,這樣做非常nice。
(2).在單個請求中刪除多篇文檔。如果有多篇文檔需要刪除,可以在一個批量請求中一次性刪除它們,這樣比每次只刪除一篇文檔更快。
(3).刪除映射類型,包括其中的文檔。這樣的操作會高效地搜索並刪除該類型中所索引的全部文檔,也包括映射本身。
(4).刪除匹配某個查詢的所有文檔。這和刪除映射類型相似,內部運行一個查詢,並識別需要刪除的文檔。只有在這里可以指定任何想要的查詢,然后刪除匹配的文檔。
1刪除單個文檔
為了刪除單一的文檔,需要向其URL發送HTTP DELETE請求
curl -XDELETE 'localhost:9200/online-shop/shirts/1'
也可以使用版本來管理刪除操作的並發,就像索引和更新的並發控制一樣。如:假設某款襯衫銷售一空,想移除這篇文檔,這樣就不會出現在搜索結果中。但是當時可能並不知道新的采購到貨了,而且庫存數據也已經被更新了。為了避免這種情況,可以再DELETE請求中加入版本參數,就像索引和更新的操作那樣
curl -XDELETE 'localhost:9200/online-shop/shirts/1?version=4'
盡管如此,刪除的版本控制還是有個特殊情況。一旦刪除了文檔,它就不復存在了,於是一個更新操作很容易重新創建該文檔,盡管這是不應該發生的(因為更新的版本比刪除的版本更低)。由於外部版本可以用於不存在的文檔上,使用外部版本時這個問題尤為突出。
為了防止這樣的問題發生,ES將在一段時間內保留這篇文檔的版本,如此它就能拒絕版本比刪除操作更低的更新操作了。默認情況下這個時間段是60秒,對於多數情況而言應該足以了,可以通過設置elasticsearch.yml文件中或者是每個索引配置中的index.gc_deletes來修改它。
2刪除映射類型和刪除查詢匹配的文檔
刪除整個映射類型,包括映射本身和其中索引的全部文檔。
curl -XDELETE 'localhost:9200/online-shop/shirts'
刪除類型時需要注意的是,類型名稱只是文檔中的另一個字段。索引中的所有文檔,無論它們屬於哪個映射類型,都存放在同一個分片中。當發送前面的命令時,ES只能查詢屬於那個類型的文檔,然后刪除它們。刪除類型通常要耗費更長的時間和更多的資源。
可以查詢某個類型中所有的文檔並刪除它們,ES允許通過稱為通過查詢刪除(delete by query)的API來指定自己的查詢,查找想要刪除的文檔。使用這個API和運行查詢類似,除了HTTP請求變溫DELETE,而且_search變為了_query。
從音樂索引music中移除所有匹配”jay”的文檔:
curl -XDELETE 'localhost:9200/music/_query?q=jay'
刪除索引
為了刪除一個索引,需要發送一個DELETE請求到該索引的URL:
curl -XDELETE 'localhost:9200/music/'
通過提供以逗號分隔的列表,還可以刪除多個索引。如果將索引名稱改為_all,甚至可以刪除全部的索引。
提示:使用curl -XDELETE 'localhost:9200/_all'會刪除所有的文檔,為了預防這種情況的發生,可以設置elasticsearch.yml中的action.destructive_requires_name:true。這會使得ES在刪除的時候拒絕_all參數,以及索引名稱中的通配符。
刪除索引是很快的,因為他基本上就是移除了和索引分片相關的文件。和刪除單獨的文檔相比,刪除文件系統中的文件更快。這樣操作的時候,文件只是被標記為已刪除。在分段進行合並時,他們才會被移除。這里的合並是指將多個Lucene小分段組合為一個更大分段的過程。
分段與合並
一個分段是建立索引的時候所創建的一塊Lucene索引(ES的分片)。當索引新的文檔時,其內容不會添加到分段的尾部,而只會創建新的分段。由於刪除操作只是將文檔標記為待刪除,所以分段中的數據也從來不會被移除。最終,更新文檔意味着重新索引,數據就永遠不會被修改。
當ES在分片上進行查詢的時候,Lucene需要查詢它所有的分段,合並結果,然后將其返回--就像查詢同一索引中多個分片的過程。就像分片那樣,分段越多,搜索請求越慢。
日常的索引操作會產生很多這樣的小片段。為了避免一個索引中存在過多的分段,Lucene定期將分段進行合並。
合並文檔意味着讀取它們的內容(除了被刪除的文檔),然后利用組合的內容創建信息、更大的分段。這個過程需要資源,尤其是CPU和磁盤的IO。合並操作是異步運行的,ES也允許配置相關的若干選項。
關閉索引
除了刪除索引,還可以關閉它們。如果關閉了一個索引,就無法通過ES來讀取和寫入其中的數據,知道再次打開它。當使用應用日志這樣的流式數據時,此操作非常有用。
當想永久的保存應用日志,以防要查看很久之前的信息。另一方面,在ES中存放大量數據需要增加資源。對於這種使用案例,關閉舊的索引非常有意義。可能並不需要那些數據,但是也不想刪除它們。
關閉索引:
curl -XPOST 'localhost:9200/online-shop/_close'
為了再次打開
curl -XPOST 'localhost:9200/online-shop/_open'
一旦索引被關閉,它在ES內存中唯一的痕跡是其元數據,如名字以及分片的位置。如果有足夠的磁盤空間,而且也不確定是否需要在那個數據中再次搜索,關閉索引要比刪除索引更好。永遠可以重新打開被關閉的索引,然后在其中再次搜索。