ES入門三部曲:索引操作,對映操作,文件操作

帝莘發表於2022-01-30

ES入門三部曲:索引操作,對映操作,文件操作

一、索引操作

1.建立索引庫

#語法
PUT /索引名稱
{
"settings": {
"屬性名": "屬性值"
}
}
#示例
PUT /es_index

說明:settings是索引庫的設定,可以定義各種屬性,一般可以不填寫,直接走預設。

2.判斷索引是否存在

#語法
HEAD  /索引名稱

#示例
HEAD  /es_index

3.檢視索引

# 語法
GET /索引名稱

# 示例
GET  /es_index

# 批量檢視索引
GET /索引名稱1,索引名稱2,索引名稱3,...

# 檢視所有索引
GET _all        ||        GET /_cat/indices?v

4.開啟索引

# 語法
POST /索引名稱/_open

# 示例
POST /es_index/_open

5.關閉索引

# 語法
POST /索引名稱/_close

# 示例
POST /es_index/_close

6.刪除索引庫

# 語法
DELETE /索引名稱1,索引名稱2,索引名稱3...

二、對映操作

索引建立後,等於有了關係型資料庫中的database。Elasticsearch7.x取消了索引type型別的設定,不允許指定型別,預設為_doc,但欄位仍然是有的,我們需要設定欄位的約束資訊,叫做欄位對映(mapping)

欄位的約束包括但不限於:

  • 欄位的資料型別
  • 是否要儲存
  • 是否要索引
  • 分詞器

1.建立對映欄位

語法

PUT /索引庫名/_mapping
{
"properties": {
"欄位名": {
"type": "型別",
"index": true,
"store": true,
"analyzer": "分詞器"
}
}
}

欄位名:任意填寫,下面指定許多屬性,例如:

  • type:型別,可以是text、long、short、date、integer、object等
  • index:是否索引,預設為true
  • store:是否儲存,預設為false
  • analyzer:指定分詞器

示例

PUT /es_index/_mapping/
{
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"job": {
"type": "text",
"analyzer": "ik_max_word"
},
"logo": {
"type": "keyword",
"index": "false"
},
"payment": {
"type": "float"
}
}
}

2.對映屬性詳解

1.type

我們說幾個關鍵的:

  • String型別,又分兩種:

    • text:可分詞,不可參與聚合
    • keyword:不可分詞,資料會作為完整欄位進行匹配,可以參與聚合
  • Numerical:數值型別,分兩類

    • 基本資料型別:long、interger、short、byte、double、float、half_float
    • 浮點數的高精度型別:scaled_float
      • 需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子後儲存,取出時再還原。
  • Date:日期型別

    elasticsearch可以對日期格式化為字串儲存,但是建議我們儲存為毫秒值,儲存為long,節省空間

  • Array:陣列型別

    • 進行匹配時,任意一個元素滿足,都認為滿足
    • 排序時,如果升序則用陣列中的最小值來排序,如果降序則用陣列中的最大值來排序
  • Object:物件型別

    {name:"Amy",age:25,friend:{name: "DaMing", age:25}}
    

    如果儲存到索引庫的是物件型別,例如上面的friend,會把friend變成兩個欄位:friend.name和friend.age

2.index

index影響欄位的索引情況。

  • true:欄位會被索引,則可以用來進行搜尋。預設值就是true

  • false:欄位不會被索引,不能用來搜尋

    index的預設值就是true,也就是說你不進行任何配置,所有欄位都會被索引。
    但是有些欄位是我們不希望被索引的,比如企業的logo圖片地址,就需要手動設定index為false。

3.store

是否將資料進行獨立儲存。
原始的文字會儲存在 source 裡面,預設情況下其他提取出來的欄位都不是獨立儲存的,是從
_source 裡面提取出來的。當然你也可以獨立的儲存某個欄位,只要設定store:true即可,獲取獨立存
儲的欄位要比從source中解析快得多,但是也會佔用更多的空間,所以要根據實際業務需求來設定,
預設為false。

4.analyzer:指定分詞器

一般我們處理中文會選擇ik分詞器 ik_max_word ik_smart

3.檢視對映關係

  • 檢視單個索引的對映關係

    # 語法GET /索引名稱/_mapping# 示例GET /es_index/_mapping
    
  • 檢視所有索引的對映關係

    # 語法GET _mapping   或者是   GET _all/_mapping
    
  • 修改索引的對映關係

    # 語法PUT /索引庫名/_mapping{"properties": {"欄位名": {"type": "型別","index": true,"store": true,"analyzer": "分詞器"}}}
    

    注意:修改對映增加欄位 做其它更改只能刪除索引 重新建立對映

4.一次性建立索引和對映

除了建立索引和對映分開做,也可以一次性的建立好索引以及對映

# 語法put /索引庫名稱{"settings":{"索引庫屬性名":"索引庫屬性值"},"mappings":{"properties":{"欄位名":{"對映屬性名":"對映屬性值"}}}}# 示例PUT /es_index{"settings": {},"mappings": {"properties": {"name": {"type": "text","analyzer": "ik_max_word"}}}}

三、文件增刪改以及區域性更新

1.新增文件

  • 新增文件(手動指定id)

    # 語法POST /索引名稱/_doc/{id}# 示例POST /es_index/_doc/1{"name" : "zae","job" : "java開發","payment" : "1000","logo" :"http://www.lgstatic.com/thubnail_120x120/i/image/M00/21/3E/CgpFT1kVdzeAJNbUAABJB7x9sm8374.png"}
    
  • 新增文件(自動生成id)

    # 語法POST /索引名稱/_doc{"field":"value"}
    

    在建立文件完成後,,在響應結果中有個 id 欄位,這個就是這條文件資料的 唯一標識 ,以後的
    增刪改查都依賴這個id作為唯一標示,這裡是Elasticsearch幫我們隨機生成的id

2.檢視單個文件

  • 語法示例

    # 語法GET /索引名稱/_doc/{id}# 示例GET/es_index/_doc/1
    
  • 文件後設資料解讀

    • index :document所屬index
    • _type: document所屬type,Elasticsearch7.x預設type為doc
    • id :代表document的唯一標識,與index和type一起,可以唯一標識和定位一個document
    • _version:document的版本號,Elasticsearch利用version (版本號)的方式來確保應用中相互衝突的變更不會導致資料丟失。需要修改資料時,需要指定想要修改文件的version號,如果該版本不是當前版本號,請求將會失敗
    • _seq_no:嚴格遞增的順序號,每個文件一個,Shard級別嚴格遞增,保證後寫入的Doc的seq_no大於先寫入的Doc的seq_no
    • primary_term:任何型別的寫操作,包括index、create、update和Delete,都會生成一個seq_no。
    • found :true/false,是否查詢到文件
    • _source 儲存原始文件

3.檢視所有文件

# 語法POST /索引名稱/_search{"query":{"match_all": {}}}

4._source定製返回結果

某些業務場景下,我們不需要搜尋引擎返回source中的所有欄位,可以使用source進行定製,如下,多
個欄位之間使用逗號分隔

# 示例GET /es_index/_doc/1?_source=name,job

5.更新文件(全部更新)

把新增的語法中請求方式改為PUT就是修改了,不過需要指定修改的id

# 語法PUT /索引名稱/_doc/{id}
  • 對應的id存在,則為修改
  • 對應的id不存在,則為新增

6.更新文件(區域性更新)

Elasticsearch可以使用PUT或者POST對文件進行更新(全部更新),如果指定ID的文件已經存在,則執行
更新操作。
注意:Elasticsearch執行更新操作的時候,Elasticsearch首先將舊的文件標記為刪除狀態,然後新增新
的文件,舊的文件不會立即消失,但是你也無法訪問,Elasticsearch會在你繼續新增更多資料的時候在
後臺清理已經標記為刪除狀態的文件。
全部更新,是直接把之前的老資料,標記為刪除狀態,然後,再新增一條更新的(使用PUT或者
POST)
局域更新,只是修改某個欄位(使用POST)

# 語法POST /索引名/_update/{id}{"doc":{"field":"value"}}

7.刪除文件

  • 根據id進行刪除操作

    # 語法DELETE /索引名/_doc/{id}
    
  • 根據條件刪除

    # 語法POST /索引庫名/_delete_by_query{"query": {"match": {"欄位名": "搜尋關鍵字"}}}# 示例:將name欄位為2的文件資料刪除POST /es_index/_delete_by_query{"query":{"match":{"name":"2"}}}
    
  • 刪除所有文件

    POST 索引名/_delete_by_query{"query": {"match_all": {}}}
    

8.文件的全量替換、強制建立

  • 全量替換

    • 語法與建立文件是一樣的,如果文件id不存在,那麼就是建立;如果文件id已經存在,那麼就是全量替換操作,替換文件的json串內容;
    • 文件是不可變的,如果要修改文件的內容,第一種方式就是全量替換,直接對文件重新建立索引,替換裡面所有的內容,elasticsearch會將老的文件標記為deleted,然後新增我們給定的一個文件,當我們建立越來越多的文件的時候,elasticsearch會在適當的時機在後臺自動刪除標記為deleted的文件
  • 強制建立

    # 強制建立PUT /index/_doc/{id}?op_type=create {},PUT /index/_doc/{id}/_create {}# 注意,強制建立時,如果id存在則會報錯
    

相關文章