中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ElasticSearch的映射mapping是什么

發布時間:2021-12-16 09:18:01 來源:億速云 閱讀:224 作者:iii 欄目:大數據

這篇文章主要講解了“ElasticSearch的映射mapping是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“ElasticSearch的映射mapping是什么”吧!

1、什么是mapping

mapping是類似于數據庫中的表結構定義,主要作用如下:

  • 定義index下的字段名

  • 定義字段類型,比如數值型、浮點型、布爾型等

  • 定義倒排索引相關的設置,比如是否索引、記錄position等

在具體介紹mapping前,有個概念必須先了解:ElasticSearch7-去掉type概念

? 關系型數據庫中兩個數據表示是獨立的,即使他們里面有相同名稱的列也不影響使用,但ES中不是這樣的。         elasticsearch是基于Lucene開發的搜索引擎,而ES中不同type下名稱相同
   的filed最終在Lucene中的處理方式是一樣的。
    ? 兩個不同type下的兩個user_name,在ES同一個索引下其實被認為是同一個filed,你必
       須在兩個不同的type中定義相同的filed映射。否則,不同type中的相同字段名稱就會在
       處理中出現沖突的情況,導致Lucene處理效率下降。
    ? 去掉type就是為了提高ES處理數據的效率。
? Elasticsearch 7.x
? URL中的type參數為可選。比如,索引一個文檔不再要求提供文檔類型。
? Elasticsearch 8.x
? 不再支持URL中的type參數。
? 解決:將索引從多類型遷移到單類型,每種類型文檔一個獨立索引

2、查看mapping

GET /[index_name]/_mapping

3、創建一個mapping

PUT /my-index-000001
{
  "mappings": {
    "properties": {
      "age":    { "type": "integer" },  
      "email":  { "type": "keyword"  }, 
      "name":   { "type": "text"  }     
    }
  }
}

說明:

integer:數字類型,默認是long

keyword:檢索時只能精確匹配

text:全文檢索,保存數據時會進行分詞

4、添加新的字段映射

PUT /my-index-000001/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false
    }
  }
}

說明

index:默認是true,被索引,也就是參與檢索,這邊設為false,說明該字段不參與檢索。

5、更新字段映射

對于已經存在的映射字段, 禁止直接修改 。更新必須創建新的索引進行數據遷移。 因為 lucene實現的倒排索引生成后不允許修改,應該重新建立新的索引,然后做reindex操作。

但是可以新增字段,通過 dynamic 參數來控制字段的新增,這個參數的值如下:

  • true:默認值,表示允許選自動新增字段

  • false:不允許自動新增字段,但是文檔可以正常寫入,但無法對字段進行查詢等操作

  • strict:嚴格模式,文檔不能寫入,報錯

示例

首先創建名為 my_dynamic_false的索引并設置mapping:

PUT my_dynamic_false
{
  "mappings": {
    "dynamic": false,
    "properties": {
      "title": {
        "type": "text"
      },
      "name": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      }
    }
  }
}

然后寫入一個文檔:

PUT my_dynamic_false/_doc/1
{
  "title": "hello world",
  "desc": "this is book"
}

注意,這里在mapping設置中,”dynamic”: false,表示在寫入文檔時,如果寫入字段不存在也不會報錯。這里的desc字段就是不存在的字段。

查詢一下寫入的文檔:

GET my_dynamic_false/_search
{
  "query": {
    "match": {
      "title": "hello"
    }
  }
}

結果: 可以通過 title字段查詢到文檔的內容

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "my_dynamic_false",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "title" : "hello world",
          "desc" : "this is book"
        }
      }
    ]
  }
}

通過desc字段查詢文檔

GET my_dynamic_false/_search
{
  "query": {
    "match": {
      "desc": "book"
    }
  }
}

結果是查不到

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

驗證一下”dynamic”: strict模式:

創建mapping

PUT my_dynamic_strict
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "title": {
        "type": "text"
      },
      "name": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      }
    }
  }
}

創建文檔

PUT my_dynamic_strict/_doc/1
{
  "title": "hello world",
  "desc": "this is book"
}

結果發現直接報錯了

{
  "error": {
    "root_cause": [
      {
        "type": "strict_dynamic_mapping_exception",
        "reason": "mapping set to strict, dynamic introduction of [desc] within [_doc] is not allowed"
      }
    ],
    "type": "strict_dynamic_mapping_exception",
    "reason": "mapping set to strict, dynamic introduction of [desc] within [_doc] is not allowed"
  },
  "status": 400
}

6、數據遷移

6.1、創建出新的映射。

PUT /newbank
{
    "mappings" : {
      "properties" : {
        "account_number" : {
          "type" : "long"
        },
        "address" : {
          "type" : "text"
        },
        "age" : {
          "type" : "integer"
        },
        "balance" : {
          "type" : "long"
        },
        "city" : {
          "type" : "keyword"
        },
        "email" : {
          "type" : "keyword"
        },
        "employer" : {
          "type" : "keyword"
        },
        "firstname" : {
          "type" : "text"
        },
        "gender" : {
          "type" : "text"
        },
        "lastname" : {
          "type" : "text"
        },
        "state" : {
          "type" : "keyword"
        }
      }
    }
  }

6.2、遷移

POST _reindex
{
  "source": {
    "index": "bank",
    "type": "account"
  },
  "dest":{
    "index": "newbank"
  }
}

7、copy_to參數說明

作用是將該字段的值復制到目標字段,不會出現在_source中,只能用來搜索。

PUT my_index_copy
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text"
        , "copy_to": "full_name"
      },
      "last_name": {
        "type": "text"
        , "copy_to": "full_name"
      },
      "full_name" : {
        "type": "text"
      }
    }
  }
}

然后創建一個新的文檔,文檔只需要寫first_name 和 last_name即可:

PUT my_index_copy/_doc/1
{
  "first_name": "john",
  "last_name": "smith"
}

查詢:

GET my_index_copy/_search
{
  "query": {
    "match": {
      "full_name": {
        "query": "john smith"
      }
    }
  }
}

結果可以查到數據,但結果集中沒有full_name

{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.5753642,
    "hits" : [
      {
        "_index" : "my_index_copy",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.5753642,
        "_source" : {
          "first_name" : "john",
          "last_name" : "smith"
        }
      }
    ]
  }
}

感謝各位的閱讀,以上就是“ElasticSearch的映射mapping是什么”的內容了,經過本文的學習后,相信大家對ElasticSearch的映射mapping是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

剑川县| 镇赉县| 五常市| 邹平县| 邹城市| 郑州市| 环江| 通榆县| 金坛市| 连山| 梅州市| 来宾市| 翁源县| 海兴县| 侯马市| 班戈县| 旬邑县| 什邡市| 东兰县| 澄城县| 治多县| 阿坝| 榆社县| 江永县| 巩义市| 会昌县| 泗阳县| 溧阳市| 深州市| 高雄市| 固安县| 琼结县| 罗源县| 新河县| 平陆县| 蓝田县| 永川市| 本溪市| 镇远县| 辽阳县| 电白县|