1. 程式人生 > >小白學ES 06 - 通過Kibana學習ES的基礎語法

小白學ES 06 - 通過Kibana學習ES的基礎語法

所有 doc 全文檢索 name created 最佳實踐 wan 博客 index

目錄

  • 1 document結構
  • 2 document的常見CRUD操作
    • 2.1 添加商品: 添加文檔並建立索引
    • 2.2 查詢商品: 檢索文檔
    • 2.3 修改商品: 替換文檔
    • 2.4 修改商品: 更新文檔
    • 2.5 刪除商品: 刪除文檔

1 document結構

ES是一款面向文檔的數據搜索、分析引擎.

document結構說明:

(1) 基於面向對象的開發思想, 應用系統中的數據結構都是很復雜的: 對象中嵌套對象, 如CRM系統中的客戶對象中, 還會嵌入客戶相關的企業對象.

(2) 對象數據存儲到數據庫中, 需要分解, 將嵌套對象分解為扁平的多張表數據, 每次操作時需要還原回對象格式, 過程繁瑣.

(3) ES存儲的是JSON格式的文檔, 基於此, ES可以提供復雜的索引, 全文檢索, 分析聚合等功能.

(4) document格式示例:

{
    "id": "5220",
    "name": "張三",
    "sex": "男",
    "age": 25, 
    "phone": 13312345678, 
    "email": "[email protected]",
    "company": {
        "name": "Alibaba",
        "location": "杭州"
    },
    "join_date": "2018/11/01"
}

2 document的常見CRUD操作

背景說明: 以電商系統的搜索子系統為例, 說明常用操作.

2.1 添加商品: 添加文檔並建立索引

  • 添加API:

    PUT /index/type/id
    {
      "JSON格式的文檔數據"
    }

說明: ES會自動創建PUT API中指定的index和type, 不需要提前創建;

而且ES默認對document的每個field都建立倒排索引, 保證它們都可以被檢索.

  • 添加示例:

    PUT /shop/it_book/1
    {
        "name": "Java編程思想",
        "author": "[美] Bruce Eckel",
        "desc":  "Java學習必讀經典,殿堂級著作!",
        "price":  109,
        "date": "2007-06",
        "publisher": "機械工業出版社",
        "tags": [ "Java", "編程語言" ]
    }
  • 響應信息:

    {
      "_index": "shop",
      "_type": "it_book",
      "_id": "1",
      "_version": 1,
      "result": "created",  # 操作結果: created(創建)了索引
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      },
      "created": true  # 是否為創建操作
    }
  • 再添加如下數據:

    PUT /shop/it_book/2
    {
        "name": "深入理解Java虛擬機:JVM高級特性與最佳實踐",
        "author": "周誌明",
        "desc":  "Java圖書領域公認的經典著作",
        "price":  79,
        "date": "2013-06",
        "publisher": "機械工業出版社",
        "tags": [ "Java", "虛擬機", "最佳實踐" ]
    }
    
    PUT /shop/it_book/3
    {
        "name": "Java並發編程的藝術",
        "author": "方騰飛,魏鵬,程曉明",
        "desc":  "阿裏系工程師的並發編程實踐",
        "price":  59,
        "date": "2015-07",
        "publisher": "機械工業出版社",
        "tags": [ "Java", "並發編程" ]
    }

2.2 查詢商品: 檢索文檔

  • 檢索API:

    GET /index/type/id
  • 檢索示例:

    GET /shop/it_book/2
  • 響應信息:

    {
      "_index": "shop",
      "_type": "it_book",
      "_id": "2",
      "_version": 1,
      "found": true,
      "_source": {
        "name": "深入理解Java虛擬機:JVM高級特性與最佳實踐",
        "author": "周誌明",
        "desc": "Java圖書領域公認的經典著作",
        "price": 79,
        "date": "2013-06",
        "publisher": "機械工業出版社",
        "tags": [
          "Java",
          "虛擬機",
          "最佳實踐"
        ]
      }
    }

2.3 修改商品: 替換文檔

  • 替換API - 與添加API相同, 只不過文檔id要存在, 此時系統將判定為修改操作:

    —— 無論文檔數據是否存在修改, 對同一id的文檔執行1次以上的PUT操作, 都是修改操作.

    PUT /index/type/id
    {
      "JSON格式的文檔數據"
    }

註意: 替換方式的不便之處: 必須填寫要修改文檔的所有field, 如果缺少, 修改後的文檔中將丟失相關field.

  • 替換示例 - 為name添加了"(第4版)"

    PUT /shop/it_book/1
    {
        "name": "Java編程思想(第4版)",
        "author": "[美] Bruce Eckel",
        "desc":  "Java學習必讀經典,殿堂級著作!",
        "price":  109,
        "date": "2007-06",
        "publisher": "機械工業出版社",
        "tags": [ "Java", "編程語言" ]
    }
  • 響應信息:

    {
      "_index": "shop",
      "_type": "it_book",
      "_id": "1",
      "_version": 2,
      "result": "updated",  // 操作結果: updated(修改)了索引
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      },
      "created": false  // 是否為創建操作
    }

2.4 修改商品: 更新文檔

  • 更新API:

    —— 指定更新文檔的某些field, 其他的不予理會.

    POST /index/type/id/_update
    {
        "doc": {
            "field u want to update": "new value of ur update's field"
        }
    }

註意: 與替換方式相比, 更新方式的好處: 可以更新指定文檔的指定field, 未指定的field也不會丟失.

  • 更新示例 - 將name改為英文:

    POST /shop/it_book/1/_update
    {
      "doc": {
        "name": "Thinking in Java(4th Edition) "
      }
    }
  • 響應信息:

    {
      "_index": "shop",
      "_type": "it_book",
      "_id": "1",
      "_version": 4,
      "result": "updated",  // 操作結果: updated(修改)了索引
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      }
    }
  • 此時查看該文檔 GET /shop/it_book/1 即可發現更新成功.

2.5 刪除商品: 刪除文檔

  • 刪除API:

    —— 指定更新文檔的某些field, 其他的不予理會.

    DELETE /index/type/id
  • 刪除示例:

    DELETE /shop/it_book/1
  • 響應信息:

    {
      "found": true,
      "_index": "shop",
      "_type": "it_book",
      "_id": "1",
      "_version": 5,
      "result": "deleted",  // 操作結果: deleted(刪除)了索引
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      }
    }
  • 再次查看刪除的文檔:

    GET /shop/it_book/1
  • 響應信息:

    {
      "_index": "shop",
      "_type": "it_book",
      "_id": "1",
      "found": false   // 沒有查找到相關文檔
    }

為了後期演示的方便, 再次將該文檔添加至索引中:

PUT /shop/it_book/1
{
    "name": "Java編程思想",
    "author": "[美] Bruce Eckel",
    "desc":  "Java學習必讀經典,殿堂級著作!",
    "price":  109,
    "date": "2007-06",
    "publisher": "機械工業出版社",
    "tags": [ "Java", "編程語言" ]
}

版權聲明

作者: ma_shoufeng(馬瘦風)

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

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

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

小白學ES 06 - 通過Kibana學習ES的基礎語法