ES文档字段分为两类:

  • 元字段(Meta-field) :不需要用户定义,在任一文档中都存在, 如_id、 _index、 _type 等
  • 业务字段: 用户自定义的字段, 也就是我们添加数据时, JSON串中的key

元字段:

元字段在名称上有一个显著的特征,就是以下划线"_" 开头, 有些字段只是为了存储,他们会出现在文档检索的结果中, 却不能通过这个字段本身做检索, 如_source ; 有些字段则只是为了索引, 他会创建出一个索引,用户可以在这个索引上检索文档,但这个字段却不会出现在最终的检索结果中, 如_all 字段。 且不是所有的字段都是默认开启的, 有些元字段需要在索引中配置开启才可使用。

下面是一些元字段的介绍:

元字段(Meta-field)
序号名称是否索引是否存储说明大类
1_id文档ID, 在映射类型内唯一标识
2_index

文档所属索引
3_type文档所属映射类型
4_uid\\在索引内唯一, 由映射类型和ID共同组成, 格式为{type}#{id}, 在6.0版本已废除
5_source原始JSON文档源文档
6_size_source 的字节数, 需要安装mapper-size插件索引
7_all所有字段一起创建索引, 6.0版本废止
8_field_names为文档非空字段名创建索引
9_ignored为忽略字段创建索引
10_routing\\文档到具体分片的路由其他
11_meta\\应用相关元信息

 

 

业务字段:

业务字段我们才会考虑es支持的数据类型。

ES支持的数据类型:

1、字符串类型 :

  • string:
  • text:
  • keyword: 

从ElasticSearch 5.x开始不再支持string,由text和keyword类型替代;当一个字段是要被全文搜索的,设置text类型,字段内容会被分析,text类型的字段不用于排序,很少用于聚合;keyword类型的字段只能通过精确值搜索到,如果字段需要进行过滤、排序、聚合,设置keyword类型。

2、整数类型:

  • long
  • integer 
  • short
  • byte 

在满足需求的情况下,尽可能选择范围小的数据类型,字段的长度越短,索引和搜索的效率越高。

3、浮点类型

  • double:64位双精度IEEE 754浮点类型 
  • float:32位单精度IEEE 754浮点类型 
  • half_float:16位半精度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、逻辑类型  :boolean 

5、日期类型  :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)

6、范围类型  :range 

范围类型要求字段值描述的是一个数值、日期或IP地址的范围, 在添加文档时可以使用: gte、gt、lt、lte分别表示 >=、 > 、< 、<= 。

具体类型又包含:

  • integer_range
  • float_range
  • long_range
  • double_range
  • data_range
  • ip_range

7、二进制类型 :binary

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

8、 复合类型

  • 数组类型 array 
  • 对象类型 object :JSON格式对象数据
  • 嵌套类型 nested 
  • 地理类型 地理坐标类型 geo_point 
  • 地理地图 geo_shape 
  • 特殊类型 IP类型 ip 
  • 范围类型 completion 
  • 令牌计数类型 token_count 
  • 附件类型 attachment 
  • 抽取类型 percolator 

在ElasticSearch中,数组是开箱即用的,不需要进行任何配置,就可以直接使用,没有专门的数组(Array)数据类型,默认情况下,任意一个字段都可以包含0或多个值。在同一个数组中,数组元素的数据类型是相同的,ElasticSearch不支持元素为多个数据类型。

9、多数据类型:

有些字段可能会以不同的方式进行检索, 如果文档字段只以一种方式编入索引, 检索性能就会受到影响。所以针对字段类型text 和 keyword , es 专门提供了一个配置字段多数据类型的参数fields, 它可以让一个字段同时具备两种数据类型的特征:

PUT articles{
    "mappings"{
        "properties":{
            "title":{
                "type":"text",
                "fields":{
                    "raw":{"type":"keyword"},
                    "length":{"type":"token_count", "analyzer":"standard"}
                }
            }
        }
    }
}

上面的示例中, title字段被设置为text, 同时通过fields参数又为该字段添加了两个子字段 raw和 length, 且分别为keyword类型和token_count 类型。使用fields设置的子字段, 在添加文档时不需要不需要单独设置字段值, 他们与title共享相同的字段值, 只是会以不同的方式处理字段值, 且在查询时不会展现出来。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐