elasticsearch基础篇(3):映射mapping

       映射定义索引中有什么字段、字段的类型等结构信息。相当于数据库中表结构定义,或 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、创建索引

【创建索引语法】

PUT /索引库名/_mapping/_doc
{
  "properties": {
    "字段名": {
      "type": "类型",
      "index": true,
      "store": true,
      "analyzer": "分词器"
    }
  }
}

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

PUT wzy
{
  "settings": {
    "number_of_replicas": 0
  }, 
  "mappings": {
    "_doc": {
      "properties": {
        "type": { "type": "keyword" }, 
        "name": { "type": "text" },
        "user_name": { "type": "keyword" },
        "email": { "type": "keyword" },
        "content": { "type": "text" },
        "tweeted_at": { "type": "date" }
      }
    }
  }
}
#执行返回结果
{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "wzy"
}

 【必看说明】
(1)type类型:可以是text,long,short,date,integer,object等;

(2)index:是否索引,默认值为true;

(3)store:是否存储,默认为false;

(4)analyzer:分词器,这里是ik_max_word,即使用ik分词器;

2、查看映射关系

【查看索引映射语法】

GET /索引名称/_mapping
#kibana中执行
GET /wzy/_mapping
#返回结果
{
  "wzy": {
    "mappings": {
      "_doc": {
        "properties": {
          "content": {
            "type": "text"
          },
          "email": {
            "type": "keyword"
          },
          "name": {
            "type": "text"
          },
          "tweeted_at": {
            "type": "date"
          },
          "type": {
            "type": "keyword"
          },
          "user_name": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

3、字段属性

3.1、字段类型type

      字段类型定义了该如何索引存储字段值。ES中提供了丰富的字段类型定义,请查看官网链接详细了解每种类型的特点:官网地址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,节省空间。

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type":   "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        }
      }
    }
  }
}

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 多重字段

       当我们需要对一个字段进行多种不同方式的索引时,可以使用fields多重字段定义。如一个字符串字段即需要进行text分词索引,也需要进行keyword 关键字索引来支持排序、聚合;或需要用不同的分词器进行分词索引。

#1、定义索引,给字段city定义一个多重字段raw
PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "city": {
          "type": "text",
          "fields": { 
            "raw": {  #raw是一个多重版本名
              "type":  "keyword"
            }
          }
        }
      }
    }
  }
}
#2、插入两条记录
PUT my_index/_doc/1
{
  "city": "New York"
}

PUT my_index/_doc/2
{
  "city": "York"
}
#3、多重字段的查询
GET my_index/_search
{
  "query": {
    "match": {
      "city": "york" 
    }
  },
  "sort": {
    "city.raw": "asc" 
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "city.raw" 
      }
    }
  }
}

3.5、元字段

元字段是ES中定义的文档字段。常见的元字段有_index、_type、_id、_version等。

 

猜你喜欢

转载自blog.csdn.net/u013089490/article/details/84316852