Elasticsearch必知必會的乾貨知識一:ES索引文檔的CRUD

来源:https://www.cnblogs.com/zuowj/archive/2020/01/18/12209702.html
-Advertisement-
Play Games

​ 若在傳統DBMS 關係型資料庫中查詢海量數據,特別是模糊查詢,一般我們都是使用like %查詢的值%,但這樣會導致無法應用索引,從而形成全表掃描效率低下,即使是在有索引的欄位精確值查找,面對海量數據,效率也是相對較低的,所以目前一般的互聯網公司或大型公司,若要查詢海量數據,最好的辦法就是使用搜索 ...


​ 若在傳統DBMS 關係型資料庫中查詢海量數據,特別是模糊查詢,一般我們都是使用like %查詢的值%,但這樣會導致無法應用索引,從而形成全表掃描效率低下,即使是在有索引的欄位精確值查找,面對海量數據,效率也是相對較低的,所以目前一般的互聯網公司或大型公司,若要查詢海量數據,最好的辦法就是使用搜索引擎,目前比較主流的搜索引擎框架就是:Elasticsearch,故今天我這裡總結了Elasticsearch必知必會的乾貨知識一:ES索引文檔的CRUD,後面陸續還會有其它乾貨知識分享,敬請期待。

  1. ES索引文檔的CRUD(6.X與7.X有區別,6.X中支持一個index創建多個type,而7.X中及以上只支持1個固定的type,即:_doc,API用法上也稍有不同):

    1. Create創建索引文檔【POST index/type/id可選,如果index、type、id已存在則重建索引文檔(先刪除後創建索引文檔,與Put index/type/id 原理相同),如果在指定id情況下需要限制自動更新,則可以使用:index/type/id?op_type=create 或 index/type/id/_create,指明操作類型為創建,這樣當存在的記錄的情況下會報錯】

      POST demo_users/_doc 或 demo_users/_doc/2vJKsm8BriJODA6s9GbQ/_create

      Request Body:

      {
      "userId":1,
      "username":"張三",
      "role":"administrator",
      "enabled":true,
      "createdDate":"2020-01-01T12:00:00"
      }

      Response Body:

      {
      "_index": "demo_users",
      "_type": "_doc",
      "_id": "2vJKsm8BriJODA6s9GbQ",
      "_version": 1,
      "result": "created",
      "_shards": {
      "total": 2,
      "successful": 1,
      "failed": 0
      },
      "_seq_no": 0,
      "_primary_term": 1
      }
    2. Get獲取索引文檔【Get index/type/id】

      Get demo_users/_doc/123

      Response Body:

      {
      "_index": "demo_users",
      "_type": "_doc",
      "_id": "123",
      "_version": 1,
      "found": true,
      "_source": {
      "userId": 1,
      "username": "張三",
      "role": "administrator",
      "enabled": true,
      "createdDate": "2020-01-01T12:00:00"
      }
      }
    3. Index Put重建索引文檔【PUT index/type/id 或 index/type/id?op_type=index,id必傳,如果id不存在文檔則創建文檔,否則先刪除原有id文檔後再重新創建文檔,version加1】

      Put/POST demo_users/_doc/123 或 demo_users/_doc/123?op_type=index

      Request Body:

      {
      "userId":1,
      "username":"張三",
      "role":"administrator",
      "enabled":true,
      "createdDate":"2020-01-01T12:00:00",
      "remark":"僅演示"
      }

      Response Body:

      {
      "_index": "demo_users",
      "_type": "_doc",
      "_id": "123",
      "_version": 4,
      "result": "updated",
      "_shards": {
      "total": 2,
      "successful": 2,
      "failed": 0
      },
      "_seq_no": 10,
      "_primary_term": 1
      }
    4. Update更新索引文檔【POST index/type/id/_update 請求體必需是{"doc":{具體的文檔JSON}},如果指定的鍵欄位已存在則更新,如果指定的鍵欄位不存在則附加新的鍵值對,支持多層級嵌套,多次請求,如果有欄位值有更新則version加1,否則提示更新0條 】

      POST demo_users/_doc/123/_update

      Request Body:

      {
        "doc": {
          "userId": 1,
          "username": "張三",
          "role": "administrator",
          "enabled": true,
          "createdDate": "2020-01-01T12:00:00",
          "remark": "僅演示POST更新5",
          "updatedDate": "2020-01-17T15:30:00"
        }
      }

      Response Body:

      {
      "_index": "demo_users",
      "_type": "_doc",
      "_id": "123",
      "_version": 26,
      "result": "updated",
      "_shards": {
      "total": 2,
      "successful": 2,
      "failed": 0
      },
      "_seq_no": 35,
      "_primary_term": 1
      }
    5. Delete刪除索引文檔【DELETE index/type/id】

      DELETE demo_users/_doc/123

      Response Body:

      {
      "_index": "demo_users",
      "_type": "_doc",
      "_id": "123",
      "_version": 2,
      "result": "deleted",
      "_shards": {
      "total": 2,
      "successful": 2,
      "failed": 0
      },
      "_seq_no": 39,
      "_primary_term": 1
      }
    6. Bulk批量操作文檔【POST _bulk 或 index/_bulk 或 index/type/_bulk 一次請求支持進行多個索引、多個type的多種不同的CRUD操作,如果操作中有某個出現錯誤不會影響其它操作;】

      POST _bulk

      Request Body:(註意最後還得多一個換行,因為ES是根據換行符來識別多條命令的,如果缺少最後一條換行則會報錯,註意請求體非標準的JSON,每行才是一個JSON,整體頂多可看成是\n區分的JSON對象數組)

      { "index" : { "_index" : "demo_users_test", "_type" : "_doc", "_id" : "1" } }
      { "bulk_field1" : "測試創建index" }
      { "delete" : { "_index" : "demo_users", "_type" : "_doc", "_id" : "123" } }
      { "create" : { "_index" : "demo_users", "_type" : "_doc", "_id" : "2" } }
      { "bulk_field2" : "測試創建index2" }
      { "update" : { "_index" : "demo_users_test","_type" : "_doc","_id" : "1" } }
      { "doc": {"bulk_field1" : "測試創建index1","bulk_field2" : "測試創建index2"} }
      
      

      Response Body:

      {
          "took": 162,
          "errors": true,
          "items": [
              {
                  "index": {
                      "_index": "demo_users_test",
                      "_type": "_doc",
                      "_id": "1",
                      "_version": 8,
                      "result": "updated",
                      "_shards": {
                          "total": 2,
                          "successful": 2,
                          "failed": 0
                      },
                      "_seq_no": 7,
                      "_primary_term": 1,
                      "status": 200
                  }
              },
              {
                  "delete": {
                      "_index": "demo_users",
                      "_type": "_doc",
                      "_id": "123",
                      "_version": 2,
                      "result": "not_found",
                      "_shards": {
                          "total": 2,
                          "successful": 2,
                          "failed": 0
                      },
                      "_seq_no": 44,
                      "_primary_term": 1,
                      "status": 404
                  }
              },
              {
                  "create": {
                      "_index": "demo_users",
                      "_type": "_doc",
                      "_id": "2",
                      "status": 409,
                      "error": {
                          "type": "version_conflict_engine_exception",
                          "reason": "[_doc][2]: version conflict, document already exists (current version [1])",
                          "index_uuid": "u7WE286CQnGqhHeuwW7oyw",
                          "shard": "2",
                          "index": "demo_users"
                      }
                  }
              },
              {
                  "update": {
                      "_index": "demo_users_test",
                      "_type": "_doc",
                      "_id": "1",
                      "_version": 9,
                      "result": "updated",
                      "_shards": {
                          "total": 2,
                          "successful": 2,
                          "failed": 0
                      },
                      "_seq_no": 8,
                      "_primary_term": 1,
                      "status": 200
                  }
              }
          ]
      }
    7. mGet【POST _mget 或 index/_mget 或 index/type/_mget ,如果指定了index或type,則請求報文中則無需再指明index或type,可以通過_source指明要查詢的include以及要排除exclude的欄位】

      POST _mget

      Request Body:

      {
        "docs": [
          {
            "_index": "demo_users",
            "_type": "_doc",
            "_id": "12345"
          },
          {
            "_index": "demo_users",
            "_type": "_doc",
            "_id": "1234567",
            "_source": [
              "userId",
              "username",
              "role"
            ]
          },
          {
            "_index": "demo_users",
            "_type": "_doc",
            "_id": "1234",
            "_source": {
              "include": [
                "userId",
                "username"
              ],
              "exclude": [
                "role"
              ]
            }
          }
        ]
      }

      Response Body:

      {
          "docs":[
              {
                  "_index":"demo_users",
                  "_type":"_doc",
                  "_id":"12345",
                  "_version":1,
                  "found":true,
                  "_source":{
                      "userId":1,
                      "username":"張三",
                      "role":"administrator",
                      "enabled":true,
                      "createdDate":"2020-01-01T12:00:00"
                  }
              },
              {
                  "_index":"demo_users",
                  "_type":"_doc",
                  "_id":"1234567",
                  "_version":7,
                  "found":true,
                  "_source":{
                      "role":"administrator",
                      "userId":1,
                      "username":"張三"
                  }
              },
              {
                  "_index":"demo_users",
                  "_type":"_doc",
                  "_id":"1234",
                  "_version":1,
                  "found":true,
                  "_source":{
                      "userId":1,
                      "username":"張三"
                  }
              }
          ]
      }

      POST demo_users/_doc/_mget

      Request Body:

      {
        "ids": [
          "1234",
          "12345",
          "123457"
        ]
      }

      Response Body:

      {
          "docs":[
              {
                  "_index":"demo_users",
                  "_type":"_doc",
                  "_id":"1234",
                  "_version":1,
                  "found":true,
                  "_source":{
                      "userId":1,
                      "username":"張三",
                      "role":"administrator",
                      "enabled":true,
                      "createdDate":"2020-01-01T12:00:00",
                      "remark":"僅演示"
                  }
              },
              {
                  "_index":"demo_users",
                  "_type":"_doc",
                  "_id":"12345",
                  "_version":1,
                  "found":true,
                  "_source":{
                      "userId":1,
                      "username":"張三",
                      "role":"administrator",
                      "enabled":true,
                      "createdDate":"2020-01-01T12:00:00"
                  }
              },
              {
                  "_index":"demo_users",
                  "_type":"_doc",
                  "_id":"123457",
                  "found":false
              }
          ]
      }
    8. _update_by_query根據查詢條件更新匹配到的索引文檔的指定欄位【POST index/_update_by_query 請求體寫查詢條件以及更新的欄位,更新欄位這裡採用了painless腳本進行靈活更新】

      POST demo_users/_update_by_query

      Request Body:(意思是查詢role=administrator【可能大家看到keyword,這是因為role欄位為text類型,無法直接匹配,需要藉助於子欄位role.keyword,如果有不理解後面會有簡要說明】,更新role為poweruser、remark為remark+採用_update_by_query更新)

      {
          "script":{ "source":"ctx._source.role=params.role;ctx._source.remark=ctx._source.remark+params.remark",
              "lang":"painless",
              "params":{
                  "role":"poweruser",
                  "remark":"採用_update_by_query更新"
              }
          },
          "query":{
              "term":{
                  "role.keyword":"administrator"
              }
          }
      }

      painless寫法請具體參考:painless語法教程

      Response Body:

      {
      "took": 114,
      "timed_out": false,
      "total": 6,
      "updated": 6,
      "deleted": 0,
      "batches": 1,
      "version_conflicts": 0,
      "noops": 0,
      "retries": {
      "bulk": 0,
      "search": 0
      },
      "throttled_millis": 0,
      "requests_per_second": -1,
      "throttled_until_millis": 0,
      "failures": [ ]
      }
    9. _delete_by_query根據查詢條件刪除匹配到的索引文檔【 POST index/_delete_by_query 請求體寫查詢匹配條件】

      POST demo_users/_delete_by_query

      Request Body:(意思是查詢enabled=false)

      {
        "query": {
          "match": {
            "enabled": false
          }
        }
      }

      Response Body:

         {
                 "took":29,
                 "timed_out":false,
                 "total":3,
                 "deleted":3,
                 "batches":1,
                 "version_conflicts":0,
                 "noops":0,
                 "retries":{
                     "bulk":0,
                     "search":0
                 },
                 "throttled_millis":0,
                 "requests_per_second":-1,
                 "throttled_until_millis":0,
                 "failures":[
      
                 ]
            }
    10. search查詢

      1. URL GET查詢(GET index/_search?q=query_string語法,註意中文內容預設分詞器是一個漢字拆分成一個term

        
        A.Term Query:【即分詞片段(詞條)查詢,註意這裡講的包含是指與分詞片段匹配】
        GET /demo_users/_search?q=role:poweruser //指定欄位查詢,即:欄位包含查詢的值
        
        GET /demo_users/_search?q=poweruser //泛查詢(沒有指定查詢的欄位),即查詢文檔中所有欄位包含poweruser的值,只要有一個欄位符合,那麼該文檔將會被返回
        
        B.Phrase Query【即分組查詢】
        操作符有:AND / OR  / NOT 或者表示為: && / || / ! 
        +表示must -表示must_not 例如:field:(+a -b)意為field中必需包含a但不能包含b
        
        GET /demo_users/_search?q=remark:(POST test) 
        GET /demo_users/_search?q=remark:(POST OR test) 
        GET /demo_users/_search?q=remark:"POST test" 
        //分組查詢,即:查詢remark中包含POST 或 test的文檔記錄
        
        GET /demo_users/_search?q=remark:(test AND POST) //remark同時包含test與POST
        GET /demo_users/_search?q=remark:(test NOT POST) //remark包含test但不包含POST
        
        C.範圍查詢
        區間表示:[]閉區間,{}開區間
        如:year:[2019 TO 2020] 或 {2019 TO 2020} 或 {2019 TO 2020] 或 [* TO 2020]
        算數符號
        year:>2019 或 (>2012 && <=2020) 或 (+>=2012 +<=2020)
        
        GET /demo_users/_search?q=userId:>123 //查詢userId欄位大於123的文檔記錄
        
        D.通配符查詢
        ?表示匹配任意1個字元,*表示匹配0或多個字元 例如:role:power* , role:use?
        
        GET /demo_users/_search?q=role:power* //查詢role欄位前面是power,後面可以是0或多個其它任意字元。
        
        可使用正則表達式,如:username:張三\d+
        
        可使用近似查詢偏移量(slop)提高查詢匹配結果【使用~N,N表示偏移量】
        GET /demo_users/_search?q=remark:tett~1 //查詢remark中包含test的文檔,但實際寫成了tett,故使用~1偏移近似查詢,可以獲得test的查詢結果
        
        GET /demo_users/_search?q=remark:"i like shenzhen"~2 //查詢i like shenzhen但實際remark欄位中值為:i like hubei and shenzhen,比查詢值多了 hubei and,這裡使用~2指定可偏移相隔2個term(這裡即兩個單詞),最終也是可以查詢出結果
        
        
      2. DSL POST查詢(POST index/_search)

        POST demo_users/_search

        Request Body:

        {
            "query":{
                "bool":{
                    "must":[
                        {
                            "term":{
                                "enabled":"true"  #查詢enabled=true
                            }
                        },
                        {
                            "term":{
                                "role.keyword":"poweruser" #且role=poweruser
                            }
                        },
                        {
                            "query_string":{
                                "default_field":"username.keyword",
                                "query":"張三" #且 username 包含張三
                            }
                        }
                    ],
                    "must_not":[
        
                    ],
                    "should":[
        
                    ]
                }
            },
            "from":0,
            "size":1000,
            "sort":[
                {
                    "createdDate":"desc"  #根據createdDate倒序
                }
            ],
            "_source":{ #指明返回的欄位,includes需返回欄位,excludes不需要返回欄位
                "includes":[
                    "role",
                    "username",
                    "userId",
                    "remark"
                ],
                "excludes":[
        
                ]
            }
        }
        

具體用法可參見:

【Elasticsearch】query_string的各種用法

Elasticsearch中 match、match_phrase、query_string和term的區別

Elasticsearch Query DSL 整理總結

[布爾查詢Bool Query]

最後附上ES官方的API操作鏈接指引:

Indices APIs:負責索引Index的創建(create)、刪除(delete)、獲取(get)、索引存在(exist)等操作。

Document APIs:負責索引文檔的創建(index)、刪除(delete)、獲取(get)等操作。

Search APIs:負責索引文檔的search(查詢),Document APIS根據doc_id進行查詢,Search APIs]根據條件查詢。

Aggregations:負責針對索引的文檔各維度的聚合(Aggregation)。

cat APIs:負責查詢索引相關的各類信息查詢。

Cluster APIs:負責集群相關的各類信息查詢。


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

-Advertisement-
Play Games
更多相關文章
  • 1. 什麼是,以及怎麼用畫中畫 Windows 10 Creators Update以後UWP提供了一個新的視圖模式CompactOverlay,中文翻譯成 緊湊的覆蓋層 ?反正大部分時間我們都會稱它為 畫中畫模式 。 上圖中右上角即為進入畫中畫模式的微軟“電影和電視”應用。 可以調用 "Appli ...
  • string aa = DateTime.Now.ToShortDateString();//"2019/9/23" string bb = DateTime.Now.ToShortTimeString();//"上午 10:21" string ff = DateTime.Now.ToLongDa ...
  • C#實現的從小到大的冒泡排序: public void BubbleSort(int[] array) { int length = array.Length; for (int i = 0; i < length - 1; i++) { for (int j = length - 1; j > i ...
  • C#實現(Delegate)的委托就不多說了,直接上代碼,看代碼中的註釋: namespace Delegate { delegate void DGSayiHi(string name);//聲明委托 delegate void DGDo(string name); class Program { ...
  • 在公司的電腦虛擬機上安裝了centos 6.5 ,然後我把他克隆下來用在家裡電腦的虛擬機上,打開後查看ip,發現只有迴環地址lo,沒有eth0, 於是重啟網路 輸入 service network restart 發現 報錯Bringing up interface eth0: Device eth ...
  • 參考 鏈接:https://gitbook.cn/books/5a33782c5778440a9d906017/index.html ...
  • 對長期奮戰在一線的後端開發人員來說,都知道redis有兩種持久化方式RDB和AOF,雖說大家都知道這兩種方式大概運作方式,但想必有實操瞭解得不會太多。 這裡是自己實操兩種持久化方式的一點點記錄。 先看以下摘錄自redis官網原文解釋(當然原文是English,這裡用google翻譯過了。) Redi ...
  • 參考鏈接:https://www.zhihu.com/question/333417513 https://www.oschina.net/p/hbase hadoop環境搭建:https://blog.csdn.net/hliq5399/article/details/78193113/ goog ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...