Elastic Search建表

前言

在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支持的数字类型如下:
    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结果

动态生成Mapping可以让我们不需要提前定义类型,可以用于未确定属性的场景下,当然如果我们需要改变类型映射的设置,可以参考官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/6.7/dynamic-templates.html

你可能感兴趣的:(Elastic Search建表)