前言
在ElasticSearch中,Index可以类比为关系型数据库中的库,Type可以类比为关系型数据库的表,Document可以类比为关系型数据库中的行。在ElasticSearch中如何建表,其实就是在ElasticSearch中如何建立Index,并且指定哪些field需要使用全文索引,指定field是什么类型等等。
ps:在ElasticSearch7.0中,type将会移除。本文建索引的格式为 PUT index_name/_doc
Mapping
Mapping指定了Index中的各个Field的类型是什么,Field类似于关系型数据库中的列属性。
我们在Mapping中指定Field是什么属性,该Field使用的分词器是什么等等,以下为一个简单的Mapping例子说明如何建立一个Mapping
PUT /my_index
{
"mappings": {
"_doc":{
"properties": {
"title": { "type": "text" },
"name": { "type": "text" },
"age": { "type": "integer" },
"created": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
}
}
}
}
}
其中my_index为你的表名,在properties中,key为你的属性名,value里面指定了你的属性的相关类型等等。
查看表结构
GET my_index/_doc/_mapping
数据类型
- Text类型
可以用于分词和搜索的文本类型为Text,常见的配置如下例子
"introduce":{
"type":"text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
(1)analyzer表示用于分词的分析器,这里使用的是IK分词器
(2)search_analyzer表示搜索的时候用于分词搜索语句的分析器,如果不指定则与analyzer相同
- keyword类型
keyword类型也是存储字符串类型的信息,一般用于存储Email,手机号码,状态码等等的结构化的信息。keyword可以用于排序,聚合。
keyword不会被分词,如何需要进行模糊匹配应该使用text类型
以下为建立keyword field的例子
PUT my_index
{
"mappings": {
"properties": {
"tags": {
"type": "keyword"
}
}
}
}
- 数字类型
ES支持的数字类型如下:
(1)当我们选用数据类型的时候,应该选用最小可以满足需求的数据类型,ES对不同的数据类型有优化。
(2)对于浮点数的优化,我们可以使用scaled_float代替浮点数,例如价格为20.123元,指定scaling_factor为100,ES内部会使用20123作为Long类型进行存储
例子如下
PUT my_index
{
"mappings": {
"properties": {
"number_of_bytes": {
"type": "integer"
},
"time_in_seconds": {
"type": "float"
},
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
}
}
- 对象类型
ES还支持嵌套的JSON类型,适合存储属性多变的properties或者data等信息,其定义如下
PUT /my_index
{
"mappings": {
"properties": {
"region": {
"type": "keyword"
},
"manager": {
"properties": {
"age": { "type": "integer" },
"name": {
"properties": {
"first": { "type": "text" },
"last": { "type": "text" }
}
}
}
}
}
}
}
如果是动态添加属性列,其类型对应动态Mapping那一章
更多的类型可以查阅官方文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
动态索引
在ElasticSearch中,我们可以不指定Mapping,然后直接插入数据。ElasticSearch会从你的JSON数据里面分析对应的类型并映射到ElasticSearch中的Type,以下为类型映射关系。
例如我们直接插入一条文档
POST test_book/_doc/1
{
"name":"泡沫",
"author":"邓紫棋",
"score":5.0
}
查看mapping可得
动态生成Mapping可以让我们不需要提前定义类型,可以用于未确定属性的场景下,当然如果我们需要改变类型映射的设置,可以参考官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/6.7/dynamic-templates.html