转自:https://blog.csdn.net/u013089490/article/details/84316852
映射定义索引中有什么字段、字段的类型等结构信息。相当于数据库中表结构定义,或 solr中的schema。因为lucene索引文档时需要知道该如何来索引存储文档的字段。
【官网中映射类别Mapping type废除说明】
ES最先的设计是用索引类比关系型数据库的数据库,用mapping type 来类比表,一个索引中可以包含多个映射类别。这个类比存在一个严重的问题,就是当多个mapping type中存在同名字段时(特别是同名字段还是不同类型的),在一个索引中不好处理,因为搜索引擎中只有 索引-文档的结构,不同映射类别的数据都是一个一个的文档(只是包含的字段不一样而已)。
从6.0.0开始限定仅包含一个映射类别定义( “index.mapping.single_type”: true ),兼容5.x中的多映射类别。从7.0开始将移除映射类别。为了与未来的规划匹配,请现在将这个唯一的映射类别名定义为“_doc”,因为索引的请求地址将规范为:PUT {index}/_doc/{id} and POST {index}/_doc

1、创建索引

【创建索引语法】

  1. PUT /索引库名/_mapping/_doc
  2. {
  3. "properties": {
  4. "字段名": {
  5. "type": "类型",
  6. "index": true
  7. "store": true
  8. "analyzer": "分词器"
  9. }
  10. }
  11. }

注意,映射类型这里没写,因为现在6.x版本还兼容但是在以后的7.x将不再兼容,这里统一要求写成_doc。

  1. PUT wzy
  2. {
  3. "settings": {
  4. "number_of_replicas": 0
  5. },
  6. "mappings": {
  7. "_doc": {
  8. "properties": {
  9. "type": { "type": "keyword" },
  10. "name": { "type": "text" },
  11. "user_name": { "type": "keyword" },
  12. "email": { "type": "keyword" },
  13. "content": { "type": "text" },
  14. "tweeted_at": { "type": "date" }
  15. }
  16. }
  17. }
  18. }
  19. #执行返回结果
  20. {
  21. "acknowledged": true,
  22. "shards_acknowledged": true,
  23. "index": "wzy"
  24. }

【必看说明】

(1)type类型:可以是text,long,short,date,integer,object等;
(2)index:是否索引,默认值为true;
(3)store:是否存储,默认为false;
(4)analyzer:分词器,这里是ik_max_word,即使用ik分词器;

2、查看映射关系

【查看索引映射语法】

  1. GET /索引名称/_mapping
  1. #kibana中执行
  2. GET /wzy/_mapping
  3. #返回结果
  4. {
  5. "wzy": {
  6. "mappings": {
  7. "_doc": {
  8. "properties": {
  9. "content": {
  10. "type": "text"
  11. },
  12. "email": {
  13. "type": "keyword"
  14. },
  15. "name": {
  16. "type": "text"
  17. },
  18. "tweeted_at": {
  19. "type": "date"
  20. },
  21. "type": {
  22. "type": "keyword"
  23. },
  24. "user_name": {
  25. "type": "keyword"
  26. }
  27. }
  28. }
  29. }
  30. }
  31. }

3、字段属性

3.1、字段类型type

  1. 字段类型定义了该如何索引存储字段值。ES中提供了丰富的字段类型定义,请查看官网链接详细了解每种类型的特点:官网地址[https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html)。

(1)String类型,该类型又分为两种

  • text:可分词,不可参与聚合;
  • keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合。

    (2)Numerical数值类型,又分为两类:

  • 基本数值类型:long、integer、short、byte、double、float、half_float等;

  • 浮点数的高精度类型:scaled_float,需要指定一个精度因子,比如10或者100。ES会把真实值乘以这个因子后存储,取出时再还原。

    (3)Date日期类型

    ES可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。

    1. PUT my_index
    2. {
    3. "mappings": {
    4. "_doc": {
    5. "properties": {
    6. "date": {
    7. "type": "date",
    8. "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
    9. }
    10. }
    11. }
    12. }
    13. }

    3.2、index属性

    字段的index属性会影响索引情况:

  • true:字段会被索引,则可以用来进行搜索,默认值就是true;

  • false:字段不会索引,不能用来进行搜索。

index属性的默认值就是true,也就是说不进行任何设置,所有字段都会被索引。但是有些字段我们不希望被索引,就需要手动设置index属性为false。

3.3、store存储属性

是否将数据进行额外存储
知道如果一个字段的store设置为false,那么在文档列表中就不会有这个字段的值,用户的搜索结果中不会显示出来。但是在Elasticsearch中,即便store设置为false,也可以搜索到结果。原因是Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source的属性中。而且我们可以通过过滤_source来选择哪些要显示,哪些不显示
而如果设置store为true,就会在_source以外额外存储一份数据,多余,因此一般我们都会将store设置为false,事实上,store的默认值就是false

3.4、Multi Field 多重字段

  1. 当我们需要对一个字段进行多种不同方式的索引时,可以使用**fields多重字段定义**。如一个字符串字段即需要进行text分词索引,也需要进行keyword 关键字索引来支持排序、聚合;或需要用不同的分词器进行分词索引。
  1. #1、定义索引,给字段city定义一个多重字段raw
  2. PUT my_index
  3. {
  4. "mappings": {
  5. "_doc": {
  6. "properties": {
  7. "city": {
  8. "type": "text",
  9. "fields": {
  10. "raw": { #raw是一个多重版本名
  11. "type": "keyword"
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
  19. #2、插入两条记录
  20. PUT my_index/_doc/1
  21. {
  22. "city": "New York"
  23. }
  24. PUT my_index/_doc/2
  25. {
  26. "city": "York"
  27. }
  28. #3、多重字段的查询
  29. GET my_index/_search
  30. {
  31. "query": {
  32. "match": {
  33. "city": "york"
  34. }
  35. },
  36. "sort": {
  37. "city.raw": "asc"
  38. },
  39. "aggs": {
  40. "Cities": {
  41. "terms": {
  42. "field": "city.raw"
  43. }
  44. }
  45. }
  46. }

3.5、元字段

元字段是ES中定义的文档字段。常见的元字段有_index、_type、_id、_version等。
elasticsearch基础篇(3):映射mapping - 图1