中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

ElasticSearch的映射與文檔

概述

映射官方文檔:

映射(she)(mapping)是(shi)ES中一(yi)個很重要的概念,我們知道ES的索引類(lei)似于(yu)MySQL中的表,而(er)映射(she)就類(lei)似于(yu)MySQL中的表結構,而(er)文檔(Document)就是(shi)MySQL表中的一(yi)行行數據。

映(ying)射(Mapping)的作用(yong)是(shi)定義文(wen)檔(dang)的結(jie)構與數據類型,同時也(ye)能設置如何對(dui)文(wen)檔(dang)進行(xing)索引(yin)

映射(she)(she)分(fen)為動(dong)態映射(she)(she)和顯示映射(she)(she)

  • 動態映射是只需在ES中添加文檔即可自動添加新字段。您可以將字段添加到頂級映射以及內部object 和nested外部字段。
  • 顯示映射是需要你添加文檔前定義好每個字段的數據類型,例如:
    • 哪些字符串字段應被視為全文字段
    • 哪些字段包含數字、日期或地理位置
    • 日期值的 格式
    • 自定義規則來控制動態添加字段 的映射

數據類型介紹

官方文檔:

常見類型

  • binary

    • 存儲編碼為 Base64 字符串的二進制值類型。
  • boolean

    • 只包含true和false兩個值
  • keyword

    • 用于結構化內容,例如 ID、電子郵件地址、主機名、狀態代碼、郵政編碼或標簽。使用分詞器時不會被分詞
  • text

    • 用于全文內容(例如電子郵件正文或產品描述)的傳統字段類型。適合全文檢索
  • date

    • 用于存儲日期,可使用format指定格式化類型
  • 數字

    • ES中數字類型有很多種,基本的可參考Java中的數據類型
      • byte:一個有符號的 8 位整數,最小值為-128,最大值為127
      • short:一個有符號的 16 位整數,最小值為-32,768,最大值為32,767
      • integer:一個有符號的 32 位整數,最小值為-231,最大值為231 - 1
      • long:一個有符號的 64 位整數,最小值為-263,最大值為263 - 1。
      • double:雙精度 64 位 IEEE 754 浮點數,限制為有限值。
      • float:單精度 32 位 IEEE 754 浮點數,限制為有限值。
      • half_float:半精度 16 位 IEEE 754 浮點數,限制為有限值。
      • scaled_float:由 支持的浮點數long,按固定double比例因子縮放
      • unsigned_long:一個無符號的 64 位整數,最小值為 0,最大值為2^64 - 1
  • 數組

    • Elasticsearch 沒有專門的array數據類型。默認情況下,任何字段都可以包含零個或多個值,但是,數組中的所有值必須屬于相同的數據類型。例如:
      • 字符串數組:[ "one", "two"]
      • 整數數組:[ 1, 2]
      • 數組的數組: [ 1, [ 2, 3]] 相當于 [ 1, 2, 3]
      • 對象數組:[ { "name": "Mary", "age": 12 }, { "name": "John", "age": 10 }]
  • 對象

    • JSON 文檔本質上是分層的:文檔可能包含內部對象,而內部對象本身又可能包含內部對象:
  • IP

    • 用于存儲IPv4或IPv6地址。

常用的(de)數據類型就是以(yi)上幾種,如果需(xu)要其它的(de)場景,可以(yi)參考官方文檔

映射的管理

創建映射

靜態映射(顯示創建)

創建(jian)索引時定義映射,控(kong)制(zhi)字段類型和配置(zhi):

PUT /my_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "refresh_interval": "1s"
  }
  // 定義映射
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "price": { "type": "double" },
      "tags": { "type": "keyword" },
      "created_at": { "type": "date", "format": "yyyy-MM-dd" }
    }
  }
}

動態映射(自動創建)

當插入(ru)文檔(dang)時,如果字段不存在,ES 會根(gen)據數據類型自(zi)動創建映射。例如:

PUT /my_index/_doc/1
{
  "title": "Elasticsearch Guide",
  "price": 49.99,
  "tags": ["search", "database"]
}

ES 會自動為(wei)字(zi)段 title(text+keyword)、price(double)和(he) tags(keyword)創建映射(she)。

查看映射

  • 查看單個索引的映射
GET /my_index/_mapping
  • 查看多個索引的映射
GET /index1,index2/_mapping
  • 查看所有索引的映射
GET /_mapping

更新映射

新增字段(支持動態更新)
可以向現有映射添加新(xin)字段:

PUT /my_index/_mapping
{
  "properties": {
    "description": { "type": "text" },
    "in_stock": { "type": "boolean" }
  }
}

修改字段類型(不支持直接修改)
若需修改現有字段類型(xing),需創建新索引并重新索引數據:

// 1. 創建新索引并定義正確的映射
PUT /new_my_index
{
  "mappings": {
    "properties": {
      "price": { "type": "integer" } // 原類型為double,現改為integer
    }
  }
}

// 2. 使用_reindex API遷移數據
POST /_reindex
{
  "source": { "index": "my_index" },
  "dest": { "index": "new_my_index" }
}

// 3. 驗證數據后刪除舊索引
DELETE /my_index

刪除映射

  • 刪除索引(同時刪除映射)
DELETE /my_index
  • 重置映射(刪除后重建)
    刪除索引后重新創建并定義新映射:
DELETE /my_index
PUT /my_index
{
  "mappings": { ... } // 新映射定義
}

映射參數詳解

核心參數

  • type:字段類型(text、keyword、integer 等)
  • index:是否索引(true/false)
  • analyzer:指定分詞器(如 standard、english)
  • search_analyzer:搜索時使用的分詞器(與 analyzer 不同時生效)
  • null_value:替代 null 值的默認值(需與字段類型匹配)
  • dynamic:控制動態添加字段的行為(true/false/strict)

高級參數

  • copy_to:將字段值復制到目標字段,便于組合搜索
  • doc_values:是否存儲列式數據(用于聚合和排序,默認 true)
  • norms:是否存儲歸一化因子(影響評分,text 默認 false)
  • fields:多字段索引(如同時存儲 text 和 keyword 類型)

文檔的管理

在 Elasticsearch(ES)中,文(wen)檔(Document)是可被索引(yin)的基本數據單(dan)元,以(yi) JSON 格式存儲(chu)

下面(mian)只列舉了常用的文檔(dang)管理的api,如(ru)果想要了解其它的可以參(can)考官方文檔(dang):

文檔的基本概念

  • 文檔結構:JSON 對象,包含字段和值。
  • 唯一性標識:每個文檔在索引中需有唯一 ID(可自動生成或手動指定)。
  • 元數據字段:
    • _index:文檔所在的索引名。
    • _id:文檔的唯一標識符。
    • _source:原始 JSON 文檔。
    • _version:文檔版本號,用于樂觀鎖。

創建文檔

指定id創建

PUT /my_index/_doc/1
{
  "title": "Getting Started with ES",
  "content": "First steps in Elasticsearch",
  "user": "john_doe",
  "views": 100
}

自動生成id

返回(hui)結果包含自動生(sheng)成的(de)_id。

POST /my_index/_doc
{
  "title": "Elasticsearch Tutorial",
  "content": "Learn Elasticsearch basics",
  "tags": ["search", "database"],
  "created_at": "2023-01-01"
}

獲取文檔

根據 ID 獲取單(dan)個文檔(dang)

GET /my_index/_doc/1

檢查文檔是否存在

HEAD /my_index/_doc/1

獲取(qu)文檔中指定的字段

GET /my_index/_doc/1?_source=filed1,filed2

更新文檔

全量更新

PUT /my_index/_doc/1
{
  "title": "Updated Title",  // 原文檔的其他字段會被刪除
  "views": 101
}

部分更新

POST /my_index/_update/1
{
  "doc": {
    "views": 102,           // 僅更新views字段
    "updated_at": "now"     // 添加新字段
  }
}

刪除文檔

根據 ID 刪除單個文檔

DELETE /my_index/_doc/1

基于查詢條件刪除(需啟用 delete-by-query 插件)

POST /my_index/_delete_by_query
{
  "query": {
    "term": {
      "user": "john_doe"
    }
  }
}

動態映射詳解

官方文檔:
動(dong)(dong)態映(ying)射是只需在ES中添加文檔即可自動(dong)(dong)添加新字(zi)(zi)段。您(nin)可以(yi)將字(zi)(zi)段添加到頂級映(ying)射以(yi)及(ji)內部object 和nested外部字(zi)(zi)段。

驗證動態映射

創建(jian)一個索引,無需指定映(ying)射(she)

PUT dynamic-mapping-01
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "refresh_interval": "1s"
  }
}

添加一個文檔

# 請求
PUT dynamic-mapping-01/_doc/1
{
  "create_date": "2015/09/02",
  "name": "huangsir",
  "age": 18,
  "addr": "BeiJing",
  "ip": "10.0.0.40"
}

查詢文檔

# 請求
GET dynamic-mapping-01/_doc/1

# 預期返回
{
  "_index" : "dynamic-mapping-01", //索引名稱
  "_type" : "_doc", // 類型
  "_id" : "1",    // 唯一標識
  "_version" : 1, //版本號
  // 排序
  "_seq_no" : 0,
  // 分片
  "_primary_term" : 1,
  "found" : true,
  // 添加的數據
  "_source" : {
    "create_date" : "2015/09/02",
    "name" : "huangsir",
    "age" : 18,
    "addr" : "BeiJing",
    "ip" : "10.0.0.40"
  }
}

查看映射

# 請求
GET /dynamic-mapping-01/_mapping

# 預期返回
{
  "dynamic-mapping-01" : {
    "mappings" : {
      "properties" : {
        "addr" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "age" : {
          "type" : "long"
        },
        "create_date" : {
          "type" : "date",
          "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
        },
        "ip" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

通過上面的(de)(de)驗證,發現其(qi)(qi)對(dui)應的(de)(de)字段的(de)(de)數據(ju)類型并不是我們想要的(de)(de),我們可以指(zhi)定其(qi)(qi)數據(ju)類型

驗證靜態映射

官方文檔:

靜態映射是在創建索(suo)引時指(zhi)定映射的(de)字段、數據類(lei)型及其它(ta)相關的(de)配置

創建索引

# 請求
PUT explicit-mapping-01
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "refresh_interval": "1s"
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "byte"
      },
      "addr": {
        "type": "keyword"
      },
      "ip": {
        "type": "ip"
      },
      "create_date": {
        "type": "date",
        "format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
      },
      "class": {
        "type": "object", 
        "properties": {
          "name":{
            "type": "text"
          }
        }
      }
    }
  }
}

# 預期返回
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "explicit-mapping-01"
}

查看映射

# 請求
GET explicit-mapping-01/_mapping

# 預期返回
{
  "explicit-mapping-01" : {
    "mappings" : {
      "properties" : {
        "addr" : {
          "type" : "keyword"
        },
        "age" : {
          "type" : "byte"
        },
        "class" : {
          "properties" : {
            "name" : {
              "type" : "text"
            }
          }
        },
        "create_date" : {
          "type" : "date",
          "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
        },
        "ip" : {
          "type" : "geo_point"
        },
        "name" : {
          "type" : "text"
        }
      }
    }
  }
}

創建文檔

# 請求
POST explicit-mapping-01/_doc
{
  "create_date": "2015/09/02",
  "name": "huangsir",
  "age": 18,
  "addr": "BeiJing",
  "ip": "10.0.0.40",
  "class": {
    "name": "清華大學"
  }
}

# 預期返回
{
  "_index" : "explicit-mapping-01",
  "_type" : "_doc",
  "_id" : "C0JSlpcB-K0y8avWYdSX",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

查看文檔

# 請求
GET explicit-mapping-01/_doc/C0JSlpcB-K0y8avWYdSX

# 預期返回
{
  "_index" : "explicit-mapping-01",
  "_type" : "_doc",
  "_id" : "C0JSlpcB-K0y8avWYdSX",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "create_date" : "2015/09/02",
    "name" : "huangsir",
    "age" : 18,
    "addr" : "BeiJing",
    "ip" : "10.0.0.40",
    "class" : {
      "name" : "清華大學"
    }
  }
}
posted @ 2025-06-22 14:29  huangSir-devops  閱讀(304)  評論(0)    收藏  舉報
作者:你的名字
出處:你的博客鏈接
本文版權歸作者和博客園共有,歡迎轉載,但必須給出原文鏈接,并保留此段聲明,否則保留追究法律責任的權利。