ES 16 - 對Elasticsearch中的索引數據進行增刪改查 (CRUD)

来源:https://www.cnblogs.com/shoufeng/archive/2019/04/13/10701141.html
-Advertisement-
Play Games

如何對Elasticsearch的索引數據進行增刪改查操作? 新增數據時是否指定id? 如何通過`_id`和`_source`元欄位查詢文檔, 全量修改和強制替換文檔的使用, 刪除文檔的原理...... 本篇文章作個比較詳細的說明~ ...


目錄

說在前面: 本文的所有演示, 都是基於Elasticsearch 6.6.10進行的, 不同的版本可能存在API發生修改、不支持的情況, 還請註意.

1 創建document

1.1 創建時手動指定id

(1) 適用情景:

從其他系統中導入數據到ES時, 會採取這種方式: 使用原有系統中數據已有的唯一標識, 作為ES中document的id.

而如果數據一生產出來就存儲到了ES中, 一般是不適合手動指定id的.

(2) 使用語法:

put index/type/id

(3) 使用示例:

PUT employee/developer/1
{
    "name": "shoufeng", 
    "e_id": 5220
}

(4) 添加成功後的響應信息:

{
  "_index" : "employee",
  "_type" : "developer",
  "_id" : "1",          // 指定了id, 控制底層的_id元欄位
  "_version" : 1,       // 當前版本號, 基於此欄位進行併發控制
  "result" : "created",
  "_shards" : {
    "total" : 2,        // 參與創建的分片數, 包括Primary和Replica
    "successful" : 1,   // 成功創建索引的分片數量
    "failed" : 0        // 創建索引失敗的分片數量
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

1.2 創建時自動生成id

(1) 使用情景:

ES作為數據存儲伺服器, 應用程式中的數據直接對接到ES中, 這種場景適合自動生成id.

在多節點併發生成大量數據的場景下, 自動生成id更具安全性.

(2) 使用語法:

POST index/type

(3) 使用示例:

POST employee/developer
{
    "name": "shoufeng",
    "sex": "male",
    "age": 20
}

(4) 添加成功後的響應結果:

{
  "_index" : "employee",
  "_type" : "developer",
  "_id" : "vMxcFWoBfKUnm9s_Uxen",  // 沒有指定id, 就會自動生成id, 長度為20個字元
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

官方文檔中指出:

Elasticsearch自動生成的id, 長度為20個字元, 是URL安全的, 它是Base64編碼的GUID字元串, 多節點(分散式系統)並行生成id時不會發生衝突.

2 查看document

2.1 根據id查詢文檔

查詢時可以不指定type, 即下述的developer, 而用_all代替.

// 查詢語法:
GET employee/developer/1

// 結果如下: 
{
  "_index" : "employee",
  "_type" : "developer",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {          // 文檔的元數據
    "name" : "shoufeng",
    "e_id" : 5220
  }
}

2.2 通過_source欄位控制查詢結果

(1) 只獲取指定id的文檔的_source內容:

GET employee/developer/1/_source
// 結果是:
{
  "name" : "shoufeng",
  "e_id" : 5220
}

(2) 禁用指定id的文檔的_source欄位:

GET employee/developer/1?_source=false
// 結果是:
{
  "_index" : "employee",
  "_type" : "developer",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true
}

(3) 過濾_source中的某些field:

// _source_includes和_source_excludes可以匹配通配符*
GET employee/developer/1?_source_includes=name,age&_source_excludes=sex
GET employee/developer/_search?_source_includes=name,age&_source_excludes=sex

(4) 通過stored_fields API過濾文檔中已存儲的欄位:

在Elasticsearch 6.0之後, 不再支持fields, 需要使用stored_fieldsAPI替換.

GET employee/developer/1?stored_fields=name,age              // 指定id
GET employee/developer/_search?stored_fields=name,age // 不指定id, 將查詢所有文檔

其他查詢操作, 將在後續的文章中專門記錄.

3 修改document

3.1 全量替換document

全量替換是基於指定文檔id的修改:

// 語法與創建語法相同: 
PUT employee/developer/1
{
    "name": "shoufeng001",  // 修改姓名
    "age": 20,              // 添加年齡
    "sex": "male",          // 添加性別
    "e_id": 5220
}

操作過程說明:

① 如果指定的document id不存在, 就是創建操作;
② 如果指定的document id已經存在, 就是全量替換操作 —— 替換舊文檔的JSON串內容;
Lucene中倒排索引一旦被創建就是不可變的, 要修改文檔內容, 可以採取全量替換的方式 —— 對文檔重新建立索引, 替換舊文檔的所有內容;
④ ES會將舊文檔標記為deleted, 然後根據我們提交的請求創建一個新文檔, 當標記為deleted的文檔數達到一定量時, ES會在自動刪除這些舊文檔.

3.2 強制創建document

(1) 存在這樣的場景:

我們不知道索引中是否已經存在某個文檔 —— 可能有其他用戶在併發添加文檔;
為了防止創建操作被執行為全量替換操作, 從而導致數據的丟失, 我們可以使用強制創建的方式, 來避免這種失誤.

(2) 強制創建示例:

PUT employee/developer/1?op_type=create
{
    "name": "shoufeng",
    "age": 20
}
// 或者使用:
PUT employee/developer/1/_create
{
    "name": "shoufeng",
    "age": 20
}

// 響應結果中出現衝突:
{
  "error": {
    "root_cause": [
      {         // 由於文檔已經存在, 發生版本衝突, 導致創建失敗
        "type": "version_conflict_engine_exception",
        "reason": "[developer][1]: version conflict, document already exists (current version [2])",
        "index_uuid": "OYu6J2x_S2S5v-R74aq6NQ",
        "shard": "3",
        "index": "employee"
      }
    ],
    "type": "version_conflict_engine_exception",
    "reason": "[developer][1]: version conflict, document already exists (current version [2])",
    "index_uuid": "OYu6J2x_S2S5v-R74aq6NQ",
    "shard": "3",
    "index": "employee"
  },
  "status": 409
}

出現衝突的原因:

Elasticsearch通過樂觀鎖控制每個文檔的_version信息, 強制創建語法會對當前操作的文檔的_version信息進行初始化;

② 添加索引時, 發現已經存在對應id的文檔, 而且其版本號與正在強制創建的文檔的版本信息不匹配, 所以報錯.

出現衝突後, 我們就能知道索引中已存在該文檔了, 就可以根據自己的應用需求, 採取更改id後重新添加, 或者更改已有的文檔等操作.

4 刪除document

(1) 刪除語法:

DELETE index/type/id

(2) 刪除示例:

DELETE employee/developer/1
// 再次查看id為1的文檔, 發現"found": false

(3) Elasticsearch刪除文檔採取的是懶刪除機制:

不會立即物理刪除, 而是將其標記為deleted, 當被刪除的文檔數量達到一定級別後, ES會在後臺自動刪除這些文檔.

版權聲明

作者: 馬瘦風

出處: 博客園 馬瘦風的博客

您的支持是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 併在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 NewSQL日漸火熱,無論還是開源的TiDB,CockroachDB還是互聯網大廠的Spanner,Oceanbase都號稱NewSQL,也就是分散式資料庫。NewSQL的典型特征就是,支持SQL,支持事務,高性能,低成本,高可靠,強一致,易擴展,運維友好等。從NewSQL的演進來看,所謂Ne ...
  • 一、事務的四大特性(ACID) 瞭解事務隔離級別之前不得不瞭解的事務的四大特性。 1、原子性(Atomicity) 事務開始後所有操作,要麼全部做完,要麼全部不做。事務是一個不可分割的整體。事務在執行過程中出錯,會回滾到事務開始之前的狀態,以此來保證事務的完整性。類似於原子在物理上的解釋:指化學反應 ...
  • 1、前置條件 MySQL資料庫中存在表user_info,其結構和數據如下: 2、自定義函數 函數:可以完成特定功能的一段SQL集合。MySQL支持自定義函數來完成特定的業務功能。 創建自定義函數(User Defined Function 簡稱UDF)的語法如下: 調用UDF的語法如下: 創建無參 ...
  • 資料庫事務併發帶來臟讀、不可重覆讀和幻讀等問題,為瞭解決這三個問題,出現了事務隔離級別,如:未提交讀取(read uncommitted)、已提交讀取(read committed)、可重覆讀取(repeatable read)、串列化(rerializable)。後續文章詳細介紹事務併發帶來的各個 ...
  • 使用索引的註意事項 使用索引時,有以下一些技巧和註意事項: 1.索引不會包含有NULL值的列 只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。所以我們在資料庫設計時不要讓欄位的預設值為NULL。 2.使用短索引 對串列進行索引, ...
  • 查詢用戶:db.system.users.find() 添加用戶:db.addUser('admin', '1234') mongodb導入csv數據 mongoimport -h localhost --port 27017 -u tor_tester -p 123456 -d torstatus ...
  • 方法1: 用SET PASSWORD命令 首先登錄MySQL。 格式:mysql> set password for 用戶名@localhost = password('新密碼'); 例子:mysql> set password for root@localhost = password('123' ...
  • 聽說過Elasticsearch的協調節點嗎? 在CRUD索引數據的時候, 就是它負責轉發客戶端的請求的. 轉發之後是如何處理請求的呢? 這篇博文作個精簡的介紹. ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...