ElasticSearch的映射mapping是什么

这篇文章主要讲解了“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是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/223995.html

(0)
上一篇 2022年1月7日
下一篇 2022年1月7日

相关推荐

发表回复

登录后才能评论