ES入門三部曲:索引操作,映射操作,文檔操作


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存在則會報錯
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM