美文网首页
Elastic Search建表

Elastic Search建表

作者: SolidHeart | 来源:发表于2019-04-12 15:29 被阅读0次

    前言

    在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建表

          本文链接:https://www.haomeiwen.com/subject/bdwqwqtx.html