ome/img/nav3_on.png">
APP
系统平台
  • 建站知识
  • 联系我们
  • 咨询热线 :
    028-86922220

    疆括仕网站建设,新征程启航

    为企业提供网站建设、域名注册、服务器等服务

    elasticsearch5.x数据类型与映射的介绍

    这篇文章主要介绍“elasticsearch 5.x数据类型与映射的介绍”,在日常操作中,相信很多人在elasticsearch 5.x数据类型与映射的介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”elasticsearch 5.x数据类型与映射的介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    成都创新互联专注于成都网站制作、成都做网站、网页设计、网站制作、网站开发。公司秉持“客户至上,用心服务”的宗旨,从客户的利益和观点出发,让客户在网络营销中找到自己的驻足之地。尊重和关怀每一位客户,用严谨的态度对待客户,用专业的服务创造价值,成为客户值得信赖的朋友,为客户解除后顾之忧。

        在前面的文章中,我们创建了索引为bank的文档结构,但是,在创建1000个文档的时候,并没有指出他们每个属性的数据类型。在没有数据类型映射定义的情况下创建文档,这在ES中是允许的,因为ES会帮我们自动映射数据类型。但是,在我们的项目中,必须要先定义文档的数据类型,再操作文档,因为我们需要根据业务的需要,指定数据的属性,例如,是否需要全文索引,是否需要分词,分词器是什么。

        下面我们看下索引bank自动创建文档数据类型映射成什么?

    {
      "bank": {
        "mappings": {
          "account": {
            "properties": {
              "account_number": {
                "type": "long"
              },
              "address": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "age": {
                "type": "long"
              },
              "balance": {
                "type": "long"
              },
              "city": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "email": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "employer": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "firstname": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "gender": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "lastname": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "state": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
        }
      }
    }

     上面通过type指定了数据的类型。接下来,我们将开始认识这些数据类型

    一、数据类型

    字段类型概述

    一级分类二级分类具体类型
    核心类型字符串类型text,keyword
     整数类型integer,long,short,byte
     浮点类型double,float,half_float,scaled_float
     逻辑类型boolean
     日期类型date
     范围类型range
     二进制类型binary
    复合类型数组类型array
     对象类型object
     嵌套类型nested
    地理类型地理坐标类型geo_point
     地理地图geo_shape
    特殊类型IP类型ip
     范围类型completion
     令牌计数类型token_count
     附件类型attachment
     抽取类型percolator

    1、字符串类型


      text 类型:当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。
      keyword:keyword类型适用于索引结构化的字段,比如email地址、主机名、状态码和标签。如果字段需要进行过滤(比如查找已发布博客中status属性为published的文章)、排序、聚合。keyword类型的字段只能通过精确值搜索到。

    2、整数类型

    类型取值范围
    byte-128~127
    short-32768~32767
    integer-231~231-1
    short-263~263-1

    在满足需求的情况下,尽可能选择范围小的数据类型。比如,某个字段的取值最大值不会超过100,那么选择byte类型即可。迄今为止吉尼斯记录的人类的年龄的最大值为134岁,对于年龄字段,short足矣。字段的长度越短,索引和搜索的效率越高。

    3、浮点类型

    类型取值范围
    doule64位双精度IEEE 754浮点类型
    float32位单精度IEEE 754浮点类型
    half_float16位半精度IEEE 754浮点类型
    scaled_float缩放类型的的浮点数

    对于float、half_float和scaled_float,-0.0和+0.0是不同的值,使用term查询查找-0.0不会匹配+0.0,同样range查询中上边界是-0.0不会匹配+0.0,下边界是+0.0不会匹配-0.0。

    其中scaled_float,比如价格只需要精确到分,price为57.34的字段缩放因子为100,存起来就是5734
    优先考虑使用带缩放因子的scaled_float浮点类型。

    4、date类型

    日期类型表示格式可以是以下几种:
    (1)日期格式的字符串,比如 “2018-01-13” 或 “2018-01-13 12:10:30”
    (2)long类型的毫秒数( milliseconds-since-the-epoch,epoch就是指UNIX诞生的UTC时间1970年1月1日0时0分0秒)
    (3)integer的秒数(seconds-since-the-epoch)

    5、boolean类型 true和false

    6、 binary类型

    进制字段是指用base64来表示索引中存储的二进制数据,可用来存储二进制形式的数据,例如图像。默认情况下,该类型的字段只存储不索引。二进制类型只支持index_name属性。

    7、array类型

    (1)字符数组: [ “one”, “two” ]
    (2)整数数组: productid:[ 1, 2 ]
    (3)对象(文档)数组: “user”:[ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }],
    注意:lasticSearch不支持元素为多个数据类型:[ 10, “some string” ]

    8、 object类型

    JSON对象,文档会包含嵌套的对象

    9、ip类型

    p类型的字段用于存储IPv4或者IPv6的地址

    二、Mapping 支持属性

    下面解释下一些重要的映射属性

    index

    设置此字段能不能被查询,就是决定要不要将这个字段放进倒排索引裡

    若index设置为true(默认是true),则表示这个这个字段会被放进倒排索引裡,如果是text就是分词过后放进索引,如果是keyword、integer...就直接整段放进索引裡

    若index设置为false,则表示这个字段不放进倒排索引裡,因此不能查询这个字段(因为他不存在于倒排索引裡)

    通常这种被设成false的字段,可以想像成是属于一种附属的字段,就是不能被match、term查询,但是当该文档被其他搜索条件搜出来时,他可以附带的一起被找出来,因为他们同属于同一个文档。

    举个例子,定义user索引的映射

    PUT /user
    {
    	"mappings": {
    		"doc": {
    			"properties": {
    				"name": {
    					"type": "keyword",
    					"index": false
    				},
    				"uid": {
    					"type": "integer"
    				},
    				"nickname": {
    					"type": "text",
    					"analyzer": "standard"
    				}
    			}
    		}
    	}
    }

    当搜索uid时,name会一起被找出来

    /user/_search
    {
        "query": {
            "term": {
                "uid": 1
            }
        }
    }

    如果搜索name属性,将会报错

    GET /user/_search
    {
        "query": {
            "term": {
                "name": "hugo"
            }
        }
    }

    出错信息如下

              "caused_by": {
                "type": "illegal_argument_exception",
                "reason": "Cannot search on field [name] since it is not indexed."
              }

    analyzer

    主要用在text类型的字段上,就是设定要使用哪种分词器来建立索引

    可以使用内建的分词器,或是使用自定义的分词器

    可以使用/_analyze测试分析器具体会将句子分词成什么样子,它能帮助我们理解Elasticsearch索引内部发生了什么

    GET 127.0.0.1:9200/_analyze
    {
        "analyzer": "standard",
        "text": "Text to analyze"
    }

    boost

    官方建议:index time boost is deprecated. Instead, the field mapping boost is applied at query time. 
    也就是说,官方推荐在查询时指定boost。

    我们可以通过指定一个boost值来控制每个查询子句的相对权重,该值默认为1。一个大于1的boost会增加该查询子句的相对权重。boost参数被用来增加一个子句的相对权重(当boost大于1时),或者减小相对权重(当boost介于0到1时),但是增加或者减小不是线性的。换言之,boost设为2并不会让最终的_score加倍。

    POST /bank/_search?pretty
    {
        "query": {
            "match" : {
                "address": {
                    "query": "mill",
                    "boost": 2
                }
            }
        }
    }

    查询结果

    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 4,
        "max_score": 8.620199,
        "hits": [
          {
            "_index": "bank",
            "_type": "account",
            "_id": "472",
            "_score": 8.620199,
            "_source": {
              "account_number": 472,
              "balance": 25571,
              "firstname": "Lee",
              "lastname": "Long",
              "age": 32,
              "gender": "F",
              "address": "288 Mill Street",
              "employer": "Comverges",
              "email": "leelong@comverges.com",
              "city": "Movico",
              "state": "MT"
            }
          },
          {
            "_index": "bank",
            "_type": "account",
            "_id": "136",
            "_score": 8.532413,
            "_source": {
              "account_number": 136,
              "balance": 45801,
              "firstname": "Winnie",
              "lastname": "Holland",
              "age": 38,
              "gender": "M",
              "address": "198 Mill Lane",
              "employer": "Neteria",
              "email": "winnieholland@neteria.com",
              "city": "Urie",
              "state": "IL"
            }
          },
          {
            "_index": "bank",
            "_type": "account",
            "_id": "970",
            "_score": 7.723722,
            "_source": {
              "account_number": 970,
              "balance": 19648,
              "firstname": "Forbes",
              "lastname": "Wallace",
              "age": 28,
              "gender": "M",
              "address": "990 Mill Road",
              "employer": "Pheast",
              "email": "forbeswallace@pheast.com",
              "city": "Lopezo",
              "state": "AK"
            }
          },
          {
            "_index": "bank",
            "_type": "account",
            "_id": "345",
            "_score": 7.723722,
            "_source": {
              "account_number": 345,
              "balance": 9812,
              "firstname": "Parker",
              "lastname": "Hines",
              "age": 38,
              "gender": "M",
              "address": "715 Mill Avenue",
              "employer": "Baluba",
              "email": "parkerhines@baluba.com",
              "city": "Blackgum",
              "state": "KY"
            }
          }
        ]
      }
    }

    三、更新映射

    当首次创建一个索引的时候,可以指定类型的映射,但假设后来想要增加一个新的映射字段,可以使用/_mapping把新的字段加进mapping映射裡

    可以增加一个新的映射,但是不能修改存在的映射,原因是因为这个映射可能有文档去用,如果改了映射的类型,可能会导致索引的数据出错,因此只能新加字段进去,不能修改

    具体实例

    在user映射中的doc类型增加一个新的名为tag的keyword
     

    PUT /user/_mapping/doc
    {
        "properties": {
            "tag": {
                "type": "keyword",
            }
        }
    }

    到此,关于“elasticsearch 5.x数据类型与映射的介绍”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


    本文题目:elasticsearch5.x数据类型与映射的介绍
    网页URL:http://tyhkzb.com/article/pjsoce.html
    在线咨询
    服务热线
    服务热线:028-86922220
    TOP