在es中,执行一个PUT操作,es会自动创建索引,自动创建索引下的类型,其实es还创建了mapping。mappingd定义了type中的每一个字段的数据类型以及这些字段如何分词等相关属性。创建索引的时候,可以预先定义字段的类型以及相关属性,这样就能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值等。学习mapping先创建一个文档,如下:
PUT /myindex/article/1 { "post_date":"2018-05-10", "title":"Java", "content":"java is the best language", "author_id":119 }
查看mapping的语句:GET /myindex/article/_mapping。结果如下:
{ "myindex": { "mappings": { "article": { "properties": { "author_id": { "type": "long" }, "content": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "post_date": { "type": "date" }, "title": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } }
可以看到查询出了索引是myindex、类型是article。
author_id字段类型是long;content类型是text;post_date类型是date;title类型是text。es会自动识别字段类型。
es是支持数据类型的,它自动创建的映射是动态映射(dynamic mapping)。
es支持的数据类型如下:
(1)核心数据类型(Core datatype)
字符串 :string,包括 text和keyword。text类型被用来索引长文本。在建立索引前会将这些文本进行分词,转化为词的组合。建立索引,允许es来检索这些词语。text类型不能用来排序和聚合。keyword类型不需要进行分词。可以被用来检索过滤、排序和聚合。keyword类型字段只能用本身来进行检索。
数字型:long、integer、short、byte、double、float
日期型:date
布尔型:boolean
二进制型:binary
日期、数值型不会分词,只能全部匹配查询,字符串可以分词,能模糊查询,举例如下:
添加如下两条数据,结合开始添加的数据,共3条数据:
PUT /myindex/article/2 { "post_date":"2018-05-12", "title":"html", "content":"i like html", "author_id":120 } PUT /myindex/article/3 { "post_date":"2018-05-16", "title":"es", "content":"Es is distributed document store", "author_id":110 }
执行查询,结果:
GET /myindex/article/_search?q=post_date:2018 不会查出数据
GET /myindex/article/_search?q=post_date:2018-05 不会查出数据
GET /myindex/article/_search?q=post_date:2018-05-10 会查出数据
GET /myindex/article/_search?q=html 会查出数据
GET /myindex/article/_search?q=java 会查出数据
(2)复杂数据类型(Complex datatypes)
数组类型(Array datatype):数组类型不需要专门指定数组元素的type,例如:
字符型数组:["one","two"]
整型数组:[1,2]
数组型数组:[1,[2,3]]等价于[1,2,3]
对象数组:[{"name":"Mary","age":12},{"name":"John","age":10}]
对象类型(Object datatype):_object_用于单个json对象
嵌套类型(Nested datatype): _nested_用于json数组
举例说明:
PUT /lib/person/1 { "name":"Tom", "age":25, "birthday":"1985-12-12", "address":{ "country":"china", "province":"guangdong", "city":"shenzhen" } }
底层存储格式为:
{ "name":["Tom"], "age":[25], "birthday":["1985-12-12"], "address.country":["china"], "address.province":["guangdong"], "address.city":["shenzhen"] }
PUT /lib/person/2 { "persons":[ {"name":"lisi","age":27}, {"name":"wangwu","age":26}, {"name":"zhangsan","age":23} ] }
底层存储格式为:
{ "persons.name":["lisi","wangwu","zhangsan"], "persons.age":[27,26,23] }
(3)地理位置类型(Geo datatypes)
地理坐标类型(Geo-point datatype): _geo_point_用于经纬度坐标
地理形状类型(Geo-Shape datatype):_geo_shape_用于类似于多边形的复杂形状
(4)特定类型(Specialised datatypes)
IPv4类型(IPv4 datatype):_ip_用于IPv4地址
Completion类型(Completion datatype): _completion_提供自动补全建议
Token count类型(Token count datatype): _token_count_ 用于统计做了标记的字段的index数目,该值会一直增加,不会因为过滤条件而减少。
mapper-murmur3类型:通过插件,可以通过 _murmur3来计算index的hash值:
附加类型(Attachment datatype):采用mapper-attachments插件,可支持_attachements_ 索引,如 Microsoft Office格式,Open Document格式,ePub,HTML等。
字段支持的属性:
"store": 字段上的值是不是被存储,如果没有存储就只能搜索,不能获取值,默认false,不存储
"index": true//分词,false//不分词,字段将不会被索引
"analyzer": "ik"//指定分词器,默认分词器为standard analyzer
"boost": 1.23//字段级别的分数加权,默认值是1.0
"ignore_above": 100//超过100个字符的文本,将会被忽略,不被索引
"search_analyzer": "ik"//设置搜索时的分词器,默认跟ananlyzer是一致的,比如index时用standard+ngram,搜索时用standard来完成自动提示功能。
手动创建mapping
put /lib { "settings":{ "number_of_shards":3, "number_of_replicas":0 }, "mappings":{ "books":{ "properties":{ "title":{"type":"text"}, "name":{"type":"text","analyzer":"standard"}, "publish_date":{"type":"date","index":false}, "price":{"type":"double"}, "number":{"type":"integer"} } } } }
指定了类型是books,字段name的分词器是analyzer,publish_date不使用分词索引。假如添加了一个新字段,新字段会按照默认的属性创建,如下 :
PUT /lib/books/1 { "title":"java is good", "name":"java", "publish_date":"2019-01-12", "price":23, "number":46, "mark":"no" }
查看一下mapping情况:
GET lib/books/_mapping
{ "lib": { "mappings": { "books": { "properties": { "mark": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "name": { "type": "text", "analyzer": "standard" }, "number": { "type": "integer" }, "price": { "type": "double" }, "publish_date": { "type": "date", "index": false }, "title": { "type": "text" } } } } } }