分佈式搜索引擎Elasticsearch基礎入門學習

一、Elasticsearch介紹

Elasticsearch介紹

Elasticsearh 是 elastic.co 公司開發的分佈式搜索引擎。

image-20230508184732325

Elasticsearch(簡稱ES)是一個開源的分佈式、高度可擴展的全文搜索和分析引擎。它能夠快速、近乎實時的存儲、搜索和分析大量數據。適用於包括文本、數字、地理空間、結構化和非結構化數據等在內的所有類型數據。

它通常爲具有複雜搜索功能的應用提供底層搜索技術。

當然,它也可以用來實現分佈式數據存儲、日誌統計、分析、系統監控、地理空間查詢等功能。

Elasticsearch 最底層的搜索引擎技術是 Apache 基金會開源的搜索引擎類庫 Lucene,Lucene 提供了搜索引擎核心 API 。

ES 在 Lucene 的基礎上提供了分佈式支持,可以水平擴展,提供了 Restful 這種簡潔的訪問接口,能被任何語言調用。

Elasticsearch能做什麼

  • 應用搜索,常見的 github 的代碼搜索,滴滴,美團,點評,銀行等各種搜索
  • 網站搜索
  • 日誌記錄和日誌分析
  • 基礎設置指標和容器監控
  • 應用性能監控
  • 地理空間數據分析和可視化
  • 商業分析
  • 安全分析

二、ELK 是什麼

ELK 是 ElasticsearchLogstashKibana 的第一個字母組合,也叫 ELK Stack。是一套用於數據採集、存儲、分析和可視化的開源工具集。

  • Elasticsearch:存儲、索引、計算、搜索、分析數據。

  • Logstash:用於收集、轉換數據,然後將它存儲在 ES 中。後面還開發新的收集數據軟件 Beats

  • Beats:它是一個輕量級的數據採集代理工具,可以向 Elasticsearch 發送數據。

  • Kibana:用於查詢分析、可視化 ES 的數據,它還可以用於監控和報警的方案。它是 Elasticsearch 基於瀏覽器的分析和搜索儀表盤。

它們之間關係圖:

image-20230508192434575

​ (來自:Elasticsearch 簡介

把上面的圖簡化下:

image-20230508223114578

三、ES中的基礎概念

文檔document

Elasticsearch 是面向文檔,它可以存儲整個對象或文檔。它不僅僅是存儲,還會索引每個文檔的內容使之可以被搜索。在 ES 中,你可以對文檔進行索引、搜索、排序、過濾。

在 ES 中,文檔是索引信息的基本單位。

JSON

Elasticsearch 使用 json 格式作爲文檔序列化格式。這種格式在 NoSQL 數據庫中使用比較多。

一個 json 對象是由 key 和 value 組成。key 是字段(field)或屬性(property)的名字,值(value)可以是字符串、數字、布爾類型、另外一個對象、值數組或其他特殊類型,比如表示日期的字符串或表示地理位置的對象。

在關係型數據庫中,使用行和列存儲數據,比如存儲在 MySQL 表中的數據:

id name
1 比亞迪電動車
2 理想電動車
3 小鵬電動車
4 比亞迪電池
5 理想電池

把上面的數據用 json 格式存儲在 elasticsearch 中:

{
    "id": 1,
    "name": "比亞迪電動車"
}
{
    "id": 2,
    "name": "理想電動車"
}
{
    "id": 3,
    "name": "小鵬電動車"
}
{
    "id": 4,
    "name": "比亞迪電池"
}
{
    "id": 5,
    "name": "理想電池"
}

上面 json 中的字段 id 相當於 MySQL 數據表中列 id。

每個文檔就是一條json數據。一條 json 數據相當於 MySQL 表中的一行。

索引index

index 索引是具有相似特徵文檔的集合。一個索引通過名字(必須全部是小寫)來標識,並且在對其中的文檔執行索引、搜索、更新和刪除操作時,都會用到這個索引的名字。

索引可以是一個名詞,相當於文檔存儲的地方。

索引也可以是一個動詞,索引一個文檔表示把一個文檔存儲到索引裏,以便它可以被檢索和查詢。

例如,你有一個用戶數據的索引,索引名稱叫 user,每一份用戶信息就是一個文檔:

{
    "id": 1,
    "name": "tom",
    "age": 25
},
{
    "id": 2,
    "name": "hanlei",
    "age": 35
},
{
    "id": 1,
    "name": "tom",
    "age": 25
},
{
    "id": 3,
    "name": "hanmeimei",
    "age": 36
}

*類型type

類型 type 這個概念在 elasticsearch 7.X 已被完全移除(參考文檔 Removal of mapping types)。這裏就不作介紹。

映射mapping

映射(mapping)是索引文檔中字段的類型和字段的其它信息,都存儲在映射(mapping)中,它也叫模式定義(schema definition)。

相當於 MySQL 數據表的 schema,如定義表結構、字段名稱、字段類型等信息。

而在 ES 中,映射可以設置某個字段的數據類型、默認值、分析器、是否被索引等等,其它處理 ES 裏面的數據使用規則設置也叫映射。

mapping還有許多內容請查看文檔:https://www.elastic.co/guide/en/elasticsearch/reference/8.4/mapping.html

mapping field doc:https://www.elastic.co/guide/en/elasticsearch/reference/8.4/mapping-fields.html

映射的設置:

{
    "mappings": {
      "properties": {
        "id": {
          "type": "keyword"
        },
        "message": {
          "type": "text"
        }
      }
    }
}

文檔元數據

一個文檔不僅僅包含 json 數據,也包含元數據 - 元數據是有關文檔信息的一些數據。

創建映射時,可以自定義其中一些元數據字段的行爲。例如,創建一個文檔:

// 先創建一個映射mapping關係,相當於MySQL中表的schema,定義json文檔中字段的屬性
PUT test
{
    "mappings": {
      "properties": {
        "id": {
          "type": "keyword"
        },
        "message": {
          "type": "text"
        }
      }
    }
}

給文檔寫入一條數據:

// 給test索引寫入一條json文檔數據
PUT test/_doc/1
{
 "id": "12",
 "message": "hello world"
}

上面 PUT test/_doc/1 命令會返回一條信息:

{
   "_index" : "test",
   "_id" : "1",
   "_version" : 1,
   "result" : "created",
  "_shards" : {
     "total" : 2,
     "successful" : 1,
     "failed" : 0
   },
   "_seq_no" : 0,
   "_primary_term" : 1
}
  • _index:表示文檔所屬的索引
  • _id:文檔唯一標識 ID
  • _source:表示文檔 doc 的原生 json 數據
  • _size:整個 _source 字段的字節大小,它是由 mapper-size 插件提供
  • _shards:表示索引的分片數。一個索引可以劃分爲多個 shards,這樣就可以存儲更多的數據

更多元數據信息請查看:https://www.elastic.co/guide/en/elasticsearch/reference/8.4/mapping-fields.html

分佈式集羣

節點node

一個節點node表示集羣中的一臺服務器,它作爲集羣的一部分存儲數據,並參與集羣的索引和搜索功能。

節點由名稱標識,默認情況下是在啓動時分配給節點的一個隨機 UUID 唯一標識符。如果不想要默認值,可以自定義節點名稱。

可以將節點通過集羣名稱加入特定集羣中。默認情況下,每個節點都加入一個名爲 “elasticsearch” 的集羣中,這意味着如果

網絡上啓動了多個節點,它們可以相互發現,那麼它們將自動形成一個名爲 elasticsearch 的集羣。

在單個集羣中,你可以擁有任意數量的節點。

此外,如果網絡上沒有其它節點在運行,則會啓動單個節點將默認形成一個名爲 elasticsearch 的新節點集羣。

集羣cluster

集羣(cluster)是由一個或多個節點node(服務器)組成,它們一起保存全部數據並提供跨所有節點的聯合索引和搜索功能。集羣由唯一標識符標識,默認爲“elasticsearch”。這個名稱很重要,因爲一個節點被設置爲通過名稱加入集羣時,該節點才能成爲集羣的一部分。

注意:擁有一個節點的集羣也是完全可以的。

此外,你也可以擁有多個獨立的集羣,每個集羣都擁有自己獨立的名稱。

分片shard和副本replica

索引可能會存儲大量的數據,而這些數據的容量可能會超過單個節點服務器的硬件容量限制。比如,佔用 1TB 磁盤空間的 10 億文檔的單個索引可能無法存儲在單個節點的磁盤上,因爲節點磁盤容量不足以容納下這麼大容量的數據,或者速度太慢無法滿足來自單個節點的搜索速度請求。

  • 這些問題怎麼解決?

Elasticsearch 可以將索引的數據進行分割,這些分割的部分稱爲分片,每個分片可以分配到不同節點上。

相當於關係型數據中存儲數據太多,而進行分庫分表操作,把數據進行分散存儲。

在 Elasticsearch 中,當你創建索引時,你可以定義想要的分片數量。每個分片都是一個功能齊全、獨立的“索引”,可以在集羣的任意節點上託管。

  • 分片的好處:
  • 它可以對數據進行水平拆分,擴展存儲數據的容量
  • 提供性能、吞吐量,它允許跨分片(可以在多個節點上)分佈數據和並行化操作
  • 如果發生網絡故障,數據丟了怎麼辦?

這時就會用到數據副本replica功能。Elasticsearch 允許將索引分片構造複製成一個或多個副本,即所謂的複製分片,簡稱副本。

這樣就提供了 ES 的高可用性,爲了高可用,ES 不允許副本分片和主分片(或原始分片)分配在同一節點上。

集羣架構圖解

在 ES 中,索引 index 是由多個 json 格式的文檔 document 組成的。每個索引 index 又可以劃分爲多個分片 Shard。

爲了保證高可用,一個分片 shard,又可以分爲主分片(primary shard)和副分片(replica shard),副分片是對主分片數據的備份,每個主分片可以有多個副分片,也就是說主分片可以有多個備份數據,

image-20230509033909819

​ (每個索引index由多個documen組成)

image-20230509034004606

​ (每個索引index可以劃分爲多個分片shard,上圖劃分爲shard 1,shard 2,shard 3)

集羣 cluster 和節點 Node,主分片 Primary 和副分片 Replica 的關係圖:

image-20230508234925720

​ (上圖中虛線框裏同顏色表示同一份數據的不同分片,Primary-主分片,和此主分片的副本(Replica - 副分片))

對上面集羣圖 Cluster 說明:

  • 把一個索引分成 3 個分片(主分片):Primary 1,Primary 2,Primary 3,然後把 3 個主分片分配到 3 個不同節點Node上
  • 每個主分片有 2 個副分片:Replica 1 和 Replica 2,且分別在不同的節點上。比如主分片 Primary 1 在 Node 1 上,它的副分片Replica 1 和 Replica 2 分別在 Node 2 和 Node 3 上

image-20230509001033438

​ (上圖:主分片和它所屬副分片,副分片是對主分片數據的備份)

ES與關係型數據庫對比

Elasticsearch 與關係型數據庫的一個簡單類比:

Elasticsearch(ES搜索引擎) Relational DB(關係型數據庫)
Indices(多個索引) Databases(數據庫)
Index(單個索引) Table(表)
Document(文檔) Row(行)
Field(字段) Column(列)

Elasticsearch集羣可以包含多個索引(indices)(數據庫),每一個索引包含多個文檔(documents)(行),然後每個文檔包含多個字段(Fields)(列)。用於理解 ES 中的概念,作一個簡單的類比。

四、數據結構: 倒排索引

下面介紹 Elasticsearch 中最重要的數據結構之一 - 倒排索引

索引簡介

索引,在生活中最常見的就是書籍的目錄,它就是一種類似索引結構,有時我們也叫索引目錄,它能讓人快速找到書籍相關章節的內容。

在計算機技術中,索引是一種常用的數據結構,目的就是加快查找數據的速度。比如我們常用的 MySQL 數據庫,就有多種索引。

在搜索引擎中,面對海量的數據,如何根據關鍵字詞快速找到用戶需要的相關內容?

這裏就要用到 倒排索引 這種數據結構,這是搜索引擎中最重要的數據結構。

倒排索引

倒排索引中的一些概念:

  • 文檔(document):用來搜索的數據,一般是以文本形式存在的存儲對象。比如一條短信,一封郵件等。更廣義的還有 Word、PDF、XML 等不同格式的文檔。
  • 文檔集合(document collection):由若干個文檔組成的集合叫文檔集合。
  • 文檔編號(document id):文檔集合中每個文檔的唯一編號,用這個唯一編號來標識這個文檔。
  • 詞條(term):對文檔數據,用某種分詞算法後,得到的有含義的詞語就是詞條。例如:我們好好學習,可以用分詞算法分爲:我們,好好學習,學習等幾個詞條。
  • 倒排索引(inverted index):倒排索引是實現詞條和文檔的一種存儲形式。通過倒排索引,可以根據詞條快速獲取包含這個詞語的文檔列表。

我們平常使用 MySQL 關係型數據庫存儲數據,裏面有數據表。創建一個關於電動車的數據表:

id name
1 比亞迪電動車
2 理想電動車
3 小鵬電動車
4 比亞迪電池
5 理想電池

怎麼把上面的表用倒排索引來表示呢?

詞條(term) 文檔id(doc id)
比亞迪 1,4
電動車 1,2,3
理想 2,5
小鵬 3
電池 4,5
1,2,3

這張表就是倒排索引。

上面 MySQL 中的表,可以看作是正向索引表,然後把這張表數據倒過來,就變成倒排索引表。

MySQL 表變成倒排索引表的處理過程:

  • 利用分詞算法對文檔數據進行分詞,得到一個一個詞條。
  • 創建倒排索引表,每行數據詞條、文檔id等

倒排索引表的詞條具有唯一性,然後可以給詞條創建索引加快查詢速度,比如哈希表索引。

五、安裝ES

下載並安裝ES

因爲我的是windows,所以我下載win的安裝包,如果你是其它系統請下載相應平臺的。我這裏想下載 V8.4.3 版本,下載地址:

但是我電腦上安裝的是 JDK 1.8,不適合 8 以上的 ES 版本,見這裏說明,JDK 和 ES 的對應版本

後面我換到了能使用jdk 1.8 的 ES V7.17.10 版本。

下載之後直接解壓,然後進入 bin 目錄,點擊 elasticsearch.bat 啓動 ES,啓動會有一些時間,稍微等一下;

9300 是 tcp 通信端口,ES 集羣之間使用 tcp 通信;9200 是 http 協議端口。

在瀏覽器上輸入 http://localhost:9200/ 查看,我這裏輸出以下數據,安裝成功了,

{
  "name": "AIS",
  "cluster_name": "elasticsearch",
  "cluster_uuid": "bKg5AkWZScafo0vp03XOyA",
  "version": {
    "number": "7.17.10",
    "build_flavor": "default",
    "build_type": "zip",
    "build_hash": "fecd68e3150eda0c307ab9a9d7557f5d5fd71349",
    "build_date": "2023-04-23T05:33:18.138275597Z",
    "build_snapshot": false,
    "lucene_version": "8.11.1",
    "minimum_wire_compatibility_version": "6.8.0",
    "minimum_index_compatibility_version": "6.0.0-beta1"
  },
  "tagline": "You Know, for Search"
}

安裝elasticsearch-head插件

elasticsearch-head 插件可以查看 ES 的各種數據。

通過 git clone 下載 head 插件:

git clone https://github.com/mobz/elasticsearch-head.git
cd ./elasticsearch-head
npm install
npm run start

瀏覽器上打開:http://localhost:9100/

image-20230509025416952

當然還有其它多種安裝方式。

第二種方式 chrome 插件安裝:

還可以通過 chrome extension 運行插件,Elasticsearch Head 在 Chrome store 的 下載地址

下載 chrome 插件後,安裝到 chrome 瀏覽器裏。

第三種方式 docker 安裝:

通過 docker 安裝,具體查看:https://github.com/mobz/elasticsearch-head

設置跨域:

如果連接不上 ES,需要設置跨域訪問,打開配置文件 config/elasticsearch.yml,在最後增加下面配置項:

http.cors.enabled: true
http.cors.allow-origin: "*"

設置完成後,重新啓動 ES。

打開 http://localhost:9100/,然後點擊連接按鈕,出現下面 green 顏色表示連接成功,如下圖:

image-20230509030403436

六、ES操作-增刪改查搜

使用cURL命令操作ES

  • curl 操作命令格式

使用 curl,將請求從命令行提交到本地 Elasticsearch 實例,這些請求包含任何 HTTP 請求相同部分:

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

命令參數說明:

命令參數 說明
HTTP 方法,例如,GET,POST,PUT,HEAD 或 DELETE
http 或 https,如果你在 ES 前面有一個 https 代理
Elasticsearch 集羣中任何節點的主機名。 或用 localhost 來代表本地機器上的節點
運行 Elasticsearch HTTP 服務的端口號,默認爲 9200
API 的終端路徑,可以包含多個參數,例如,_cluster/stats
<QUERY_STRING> 任何可選的查詢字符串參數。
JSON 編碼格式的請求正文,如果有需要

如果 elasticsearch 啓動了安全功能,則必須提供有權限運行 API 的有效用戶名和密碼:

curl -u elastic:password -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

// elastic 用戶名
// password 密碼
  • curl 安裝和文檔地址

我是win這裏用 chocolatey 安裝:

choro install curl

安裝完成後直接 cd 到它的安裝目錄 C:\ProgramData\chocolatey\bin 目錄下,然後執行查看 curl 版本命令,安裝成功:

不知道安裝到哪裏了?可以使用 where curl 命令來查詢安裝位置

image-20230509193440932

查詢 ES 的 http 服務端口 9200,命令:curl.exe -XGET 'http://localhost:9200' -H 'Content-Type: application/json'

image-20230509195246969

這裏還可以使用 Go 語言實現的 curl 工具 curlie 來操作 ES。

  • 安裝 curlie
go install github.com/rs/[email protected]

用 curlie 在 terminal 上訪問 HTTP 端口 9200,我是 win 使用 PowerShell,命令如下:

curlie -XGET 'http://localhost:9200' -H 'Content-Type: application/json'

返回結果:

image-20230509164840949

如果 ES 設置了用戶和密碼,可以用如下命令:

$ curlie -XGET -u "elastic:pwdes" 'http://localhost:9200/' -H 'Content-Type: application/json'

說明:如果運行 curlie 返回安全錯誤信息,那麼找到ES安裝位置,然後在 config/elasticsearch.yml 文件最後面加上

xpack.security.enabled: false ,把安全驗證設置爲 false。

創建索引和文檔

前面說了,索引 index 可以是名詞存儲文檔的地方,也可以是動詞創建索引的意思。

創建索引基本語法:

PUT /{索引名稱}

創建索引和文檔基本語法:

PUT /{索引名稱}/_doc/文檔id
// 也可以把上面 PUT 換成 POST 
  • curl創建索引和文檔:

例如,創建一個賣書的書店bookmall索引,然後給索引增加一些數據,命令如下:

curl -XPUT "http://localhost:9200/bookmall/_doc/1?pretty" -H "Content-Type: application/json" -d '{"product_id": 123456, "quantity": 100}'

我的是windows,在cmd下運行後出錯,出錯信息如下:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "mapper_parsing_exception",
        "reason" : "failed to parse"
      }
    ],
    "type" : "mapper_parsing_exception",
    "reason" : "failed to parse",
    "caused_by" : {
      "type" : "json_parse_exception",
      "reason" : "Unexpected character ('p' (code 112)): was expecting double-quote to start field name\n at [Source: (ByteArrayInputStream); line: 1, column: 3]"
    }
  },
  "status" : 400
}

需要把上面的命令修改下,雙引號前加上斜線,

curl -XPUT 'http://localhost:9200/bookmall/_doc/1?pretty' -H 'Content-Type: application/json' -d '{\"product_id\": 123456, \"quantity\": 100}'

在運行,成功了,返回信息:

{
  "_index" : "bookmall",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

在 linux 下就不需要加這條斜線,所以學習建議在 linux 平臺下。 - -!

上面的命令 curl -XPUT 也可以換成 curl -XPOST

例如,博客巴士的博客文章,我們可以用 ES 來索引這些博客文章信息。

下面我使用 Postman 這款測試 API 的軟件來增加索引,打開 Postman 軟件(如沒安裝請先安裝),首先新建一個請求的 tab,

image-20230509212534805

然後在 Headers 里加上 Content-Type: application/json ,如下:

image-20230509203955945

然後請求方法選擇 PUT, url 欄裏填上 http://localhost:9200/blogerbus/_doc/1?pretty ,然後點擊 body,選擇 raw 選項,格式選擇 JSON , 填上 json 格式的數據,最後點擊 Send 按鈕發送數據,如下圖:

image-20230509204539954

Status:201 Created ,成功返回數據:

{
    "_index": "blogerbus",
    "_type": "_doc",
    "_id": "1",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

對這條 URL http://localhost:9200/blogerbus/_doc/1?pretty 的說明:

  • http://localhost:9200:ES HTTP 本地服務端地址:端口號

  • blogerbus:索引名稱

  • _doc:文檔終端endpoint,ES 裏的一個固定字段

  • 1:文檔 id

  • ?preety:將返回的json格式化數據,顯示爲更易於讓人閱讀的形式

查詢索引index文檔

基本語法:

// 根據單個id查詢
GET /{索引名稱}/_doc/文檔id

//批量查詢:查詢該索引庫下的全部文檔 
GET /{索引名稱}/_search

用 Postman 來查詢索引文檔,在url欄輸入 http://localhost:9200/blogerbus/_doc/1?pretty=true,點擊 Send,返回:

image-20230509205523297

返回內容:

{
    "_index": "blogerbus",
    "_type": "_doc",
    "_id": "1",
    "_version": 1,
    "_seq_no": 0,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "user": "lilei",
        "create_at": "2021-09-15T08:12:43",
        "title": "hello world",
        "article": "hello world, this is good thing"
    }
}

搜索

基本語法:

GET /{索引名稱}/_search  // 後面可以跟一些查詢字符串,也可以跟json的DSL

給索引 blogerbus 多增加幾個文檔,用於我們的搜索:

// 第2篇文檔,http://localhost:9200/blogerbus/_doc/2?pretty
{
    "user": "lilei", 
    "create_at": "2021-09-18T09:12:04", 
    "title": "math lesson",
    "article": "hello math, this my first lesson"
}

// 第3篇文檔,http://localhost:9200/blogerbus/_doc/3?pretty
{
    "user": "hanmeimei", 
    "create_at": "2021-10-10T03:24:34", 
    "title": "test lesson",
    "article": "hello lesson, this my test lesson"
}
  • Postman 搜索

搜索 user 爲 lilei 的所有文章,在 Postman 的url欄輸入:http://localhost:9200/blogerbus/_search?q=user:lilei&pretty=true,點擊 Send 按鈕,返回值:

image-20230509211359550

上面是直接在 url 上用字符串查詢,還可以用 json 格式來查詢:

{
    "query" : {
        "match" : { "user": "lilei" }
    }
}

url 修改爲 http://localhost:9200/blogerbus/_search?pretty=true

image-20230509211858549

返回的數據與上面相同。

  • curl 搜索
curl -XGET 'http://localhost:9200/blogerbus/_search?pretty=true' -H 'Content-Type: application/json' -d '{\"query\": {\"match\":{\"user\": \"lilei\"}}}'

返回的內容與 Postman 搜索返回內容相同

刪除

刪除文檔基本語法:

DELETE /{索引名稱}/_doc/文檔id

例如,curl 刪除一篇 id 爲 2 的文檔:

curl -XDELETE 'http://localhost:9200/bookmall/_doc/2'

返回:

{"_index":"bookmall","_type":"_doc","_id":"2","_version":3,"result":"deleted","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":3,"_primary_term":1}

後面沒有加?pretty=true,所以返回數據排版是不易讀的json。

刪除索引基本語法:

DELETE /{索引名稱}

修改

修改有2種方式:全量修改和增量修改

  • 全量修改:直接覆蓋原來的文檔。根據指定 id 刪除,id 不存在時,修改變成新增。

基本語法:

PUT /{索引名稱}/_doc/文檔id
{
    "字段1": "值1",
    "字段2": "值2",
    // ... 略
}
  • 增量修改:修改文檔中部分字段,只修改指定 id 中匹配文檔的部分字段。

基本語法:

POST /{索引名稱}/_update/文檔id
{
    "doc": {
         "字段名": "新值",
    }
}

curl 全量修改:

把上面的 bookmall/_doc/1 中 2 個字段值都修改下:

curl -XPUT "http://localhost:9200/bookmall/_doc/1?pretty" -H "Content-Type: application/json" -d '{\"product_id\": 1234567, \"quantity\": 1000}'

修改成功後返回數據:

{
  "_index" : "bookmall",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 4,
  "_primary_term" : 1
}

那能不能修改值的同時新增一個字段?可以的。例如,給文檔 id 爲 1 的新增一個字段 num:50 ,修改 quantity 爲 2000,如下:

curl -XPUT "http://localhost:9200/bookmall/_doc/1?pretty" -H "Content-Type: application/json" -d '{\"product_id\": 123456, \"quantity\": 2000,\"name\":\"shiije\",\"num\":50}'

可以修改成功。

curl 部分修改:

修改文檔 id 爲 1 中的字段 product_id 爲 123,

curl -XPOST "http://localhost:9200/bookmall/_update/1?pretty" -H "Content-Type: application/json" -d '{\"doc\":{\"product_id\": 123}}'

可以修改成功。

七、參考

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