ElasticSearch之基础数据类型

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"
      }
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值