1.text
text数据类型是全文搜索类型,对一个的字符串会被分词,可以通过单个词搜索到对应的数据。但是text类型不能用于排序或者聚合等操作,如果想要全文分词搜索又要排序或者聚合,可以和keywod一起构建多元字段类型。
2.keyword
keyword数据类型是精确检测,通常用于过滤、聚合、排序等操作。
3.数值型
- long :64位
- integer : 32位
- short :16位,范围 [-32768, 32767]
- byte : 8位,范围[-128, 127]
- float :32位
- double:64位
建议根据字段的具体范围确定类型,节省空间和查询效率
4.数组
es并没有数组具体的数据类型,例如text和keyword都是可以直接存入数组数据,数组中每个元素都具有text或者keyword的属性。对于接口查询也没有直接数组的接口,使用方法与text或者keywod一样的用法。
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"service": {
"type": "text"
},
"product": {
"type": "keyword"
}
}
}
}
}
POST my_index/my_type/11
{
"service" : ["安徽合肥", "江苏南京"],
"product" : ["浙江杭州", "广东广州"]
}
则service中各个元素都是text属性,product中各个元素都是keyword属性,查询和一般的查询语句一样
GET my_index/_search
{
"query": {
"term": {
"product": {
"value": "浙江杭州"
}
}
}
}
对于复杂的对象建议使用nested类型
5.date
见 :https://blog.csdn.net/qq_18218071/article/details/113471974
6.boolean
只接受 false、“false” 、true、 “true” 四种值的赋值。
7.range
- integer_range 范围 32位
- float_range 范围 32位
- long_range 范围 64位
- double_range 范围 64位
- date_range
- ip_range
例子
PUT range_index
{
"mappings": {
"my_type": {
"properties": {
"expected_attendees": {
"type": "integer_range"
},
"time_frame": {
"type": "date_range",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
插入数据
POST range_index/my_type/111
{
"expected_attendees" : {
"gte" : 30,
"lte" : 45
},
"time_frame" : {
"gte" : "2015-10-31 12:00:00",
"lte" : "2015-11-01"
}
}
查询是否有满足条件的数据
GET range_index/_search
{
"query": {
"range": {
"expected_attendees": {
"gte" : 50
}
}
}
}
8.object
es的数据其实就是一个JSON串,对象内可以包含对象
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"region": {
"type": "keyword"
},
"manager": {
"properties": {
"age": { "type": "integer" },
"name": {
"properties": {
"first": { "type": "keyword" },
"last": { "type": "keyword" }
}
}
}
}
}
}
}
}
插入一条数据:
PUT my_index/my_type/1
{
"region": "US",
"manager": {
"age": 30,
"name": {
"first": "John",
"last": "Smith"
}
}
}
这里的manager和name都是object类型
其实es内部都是键值对,可以把多层信息进行压平看待,这在动态模板中路径配置也是用到的。
{
"region": "US",
"manager.age": 30,
"manager.name.first": "John",
"manager.name.last": "Smith"
}
同样他们的查询的方式也是按照压平的方式
GET my_index/_search
{
"query": {
"term": {
"manager.name.first": {
"value" : "John"
}
}
}
}
object类型不需要显示设置,但是如果字段存储的是对象数组就要使用使用nested类型
9.nested
嵌套是对象的特殊形式,主要是为了解决字段存储的是对象数组的情况,这是也是object和nested的区别,可以查看es官网 https://www.elastic.co/guide/en/elasticsearch/reference/5.6/nested.html
下面给一个例子:比官网的稍微复杂一点, manager是一个nested,它内部的name也是一个nested,物理意思是对象可以有多个管理者,一个管理者可以有多个名字,每个名字都有firstName和lastName
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"region": {
"type": "keyword"
},
"manager": {
"type" : "nested",
"properties": {
"age": { "type": "integer" },
"name": {
"type" : "nested",
"properties": {
"first": { "type": "keyword" },
"last": { "type": "keyword" }
}
}
}
}
}
}
}
}
插入一条数据:
PUT my_index/my_type/1
{
"region": "US",
"manager": [{
"age": 30,
"name": [
{
"first": "John",
"last": "Smith"
},
{
"first": "alice",
"last": "james"
}
]
},
{
"age": 21,
"name": [
{
"first": "tom",
"last": "lili"
},
{
"first": "luvy",
"last": "clivk"
}
]
}]
}
查询语句:
GET my_index/_search
{
"query": {
"nested": {
"path": "manager",
"query": {
"nested": {
"path": "manager.name",
"query": {
"bool": {
"must": [
{ "match": { "manager.name.first": "alice" }},
{ "match": { "manager.name.last": "james" }}
]
}
}
}
}
}
}
}
如果:manager不是nested,那么定义如下:
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"region": {
"type": "keyword"
},
"manager": {
"properties": {
"age": { "type": "integer" },
"name": {
"type" : "nested",
"properties": {
"first": { "type": "keyword" },
"last": { "type": "keyword" }
}
}
}
}
}
}
}
}
则对应的查询语句为:
GET my_index/_search
{
"query": {
"nested": {
"path": "manager.name",
"query": {
"bool": {
"must": [
{ "match": { "manager.name.first": "alice" }},
{ "match": { "manager.name.last": "james" }}
]
}
}
}
}
}
10.token_count
分词后个数:获取字符串经过分词后长度,其实是和text或者keyword等联合在一起,作为一个复合类型
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"name": {
"type": "keyword",
"fields": {
"length": {
"type": "token_count",
"analyzer": "standard"
}
}
}
}
}
}
}
插入数据
PUT my_index/my_type/2
{ "name": "Rachel Alice Williams" }
查询:
GET my_index/_search
{
"query": {
"term": {
"name.length": 3
}
}
}
//也可以直接查询name的值
GET my_index/_search
{
"query": {
"term": {
"name": {
"value" : "Rachel Alice Williams"
}
}
}
}