美文网首页
04-ElasticSearch的Mapping

04-ElasticSearch的Mapping

作者: Y了个J | 来源:发表于2020-08-13 13:34 被阅读0次

    ElasticSearch7-去掉type概念
    关系型数据库中两个数据表示是独立的,即使他们里面有相同名称的列也不影响使用,但ES中不是这样的。elasticsearch是基于Lucene开发的搜索引擎,而ES中不同type下名称相同的filed最终在Lucene中的处理方式是一样的。
    1.两个不同type下的两个user_name,在ES同一个索引下其实被认为是同一个filed,你必须在两个不同的type中定义相同的filed映射。否则,不同type中的相同字段名称就会在处理中出现冲突的情况,导致Lucene处理效率下降。
    2.去掉type就是为了提高ES处理数据的效率。

    Elasticsearch 7.x URL中的type参数为可选。比如,索引一个文档不再要求提供文档类型,Elasticsearch 8.x 不再支持URL中的type参数。

    Mapping(映射)
    Maping是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和索引的。比如:使用maping来定义:
    哪些字符串属性应该被看做全文本属性(full text fields);
    哪些属性包含数字,日期或地理位置;
    文档中的所有属性是否都嫩被索引(all 配置);
    日期的格式;
    自定义映射规则来执行动态添加属性;

    创建映射

    创建索引并指定映射

    PUT /my_index
    {
      "mappings": {
        "properties": {
          "age": {
            "type": "integer"
          },
          "email": {
            "type": "keyword"
          },
          "name": {
            "type": "text"
          }
        }
      }
    }
    
    添加新的字段映射
    PUT /my_index/_mapping
    {
      "properties": {
        "employee-id": {
          "type": "keyword",
          "index": false
        }
      }
    }
    

    这里的 “index”: false,表明新增的字段不能被检索,只是一个冗余字段。

    更新映射

    对于已经存在的字段映射,我们不能更新。更新必须创建新的索引,进行数据迁移。

    数据迁移

    查看bank数据:GET /bank/_search

    {
      "took" : 0,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 1000,
          "relation" : "eq"
        },
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "bank",
            "_type" : "account",//类型为account
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "account_number" : 1,
              "balance" : 39225,
              "firstname" : "Amber",
              "lastname" : "Duke",
              "age" : 32,
              "gender" : "M",
              "address" : "880 Holmes Lane",
              "employer" : "Pyrami",
              "email" : "amberduke@pyrami.com",
              "city" : "Brogan",
              "state" : "IL"
            }
          },
          ...
    

    查看bank的mapping信息:GET bank/_mapping

    {
      "bank" : {
        "mappings" : {
          "properties" : {
            "account_number" : {
              "type" : "long"
            },
            "address" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "age" : {
              "type" : "long"
            },
            "balance" : {
              "type" : "long"
            },
            "city" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "email" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "employer" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "firstname" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "gender" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "lastname" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "state" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        }
      }
    }
    

    创建新的映射,然后把老的bank数据迁移到new_bank。

    PUT /new_bank
    {
        "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" : "keyword"
            },
            "lastname" : {
              "type" : "text"
            },
            "state" : {
               "type" : "keyword"
            }
          }
        }
    }
    

    开始迁移数据

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

    查看new_bank的数据和mapping

    GET new_bank/_mapping
    GET new_bank/_search
    

    更多详情见: https://www.elastic.co/guide/en/elasticsearch/reference/7.6/docs-reindex.html

    相关文章

      网友评论

          本文标题:04-ElasticSearch的Mapping

          本文链接:https://www.haomeiwen.com/subject/zmtvdktx.html