一:名词介绍
一个elasticsearch可以理解为一个集群。里面可以包含多个索引,一个索引可以有多个类型,一个类型可以包含多个文档,一个文档也可以包含多个字段。
elasticsearch会把每个索引分成不同的分片,每个分片可以在一个集群里互相迁移。
结构:此处用DB对比理解。
DB | ES |
数据库(DataBase) | 索引(Indices) |
表(Tables) | 类型(Types) |
行(Rows) | 文档(Documents) |
字段(Columns) | 字段(fields) |
字段类型:
text | 字符串 | ⽤于全⽂索引,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合 |
keyword | 字符串 | 如果字段需要进行过滤、排序、聚合。keyword类型的字段只能通过精确值搜索到 |
byte | 整数 | 取值范围:-128~127 |
short | 整数 | 取值范围:-32768~32767 |
integer | 整数 | 取值范围:-2^31~2^31-1 |
long | 整数 | 取值范围:-2^63~2^63-1 |
double | 浮点型 | 64位双精度 |
float | 浮点型 | 32位双精度 |
half_float | 浮点型 | 16位半精度 |
scaled_float | 浮点型 | 缩放类型的浮点数 |
date | 日期类型 | 可以指定format: "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" |
boolean | 布尔类型 | true,false |
binary | 二进制数据 | 存储二进制数据,例如图像等,默认情况下该字段不索引 |
integer_range | 范围类型 | 一系列带符号的32位整数,最小值为-2^31,最大值为2^31-1 |
float_range | 范围类型 | 一系列单精度32位浮点型 |
long_range | 范围类型 | 一系列单精度64位整数,-2^63~2^63-1 |
date_range | 范围类型 | 一系列日期值表示为无符号的64位整数毫秒。 |
ip_range | 范围类型 | 支持IPv4或IPv6(或混合)地址的一系列ip值 |
object | 对象类型 | |
arrary | 数组 | |
ip | ip地址 | |
二:基本操作
# 创建索引
PUT mydb
# 删除索引
DELETE mydb
# 创建索引规则
PUT /mydb/_mappings?pretty
{
"properties":{
"name":{
"type":"keyword"
},
"age":{
"type":"byte"
},
"address":{
"type":"text",
"analyzer": "ik_smart"
},
"birthday":{
"type":"date",
"format":"yyyy-MM-dd"
}
}
}
# 查看索引规则
GET mydb/_mapping
# 插入(文档相同则会覆盖)一条数据
PUT /mydb/_doc/3
{
"name":"王五",
"age":20,
"address":"上海市徐汇区",
"birthday":"2020-01-10"
}
# 查询索引下所有数据
POST /mydb/_search
# 查询一条数据
GET /mydb/_doc/1
# 修改一条数据
POST /mydb/_doc/2/_update
{
"doc":{
"birthday":"2020-02-02"
}
}
# 删除一条数据
DELETE /mydb/_doc/3
三:花式查询
# 查询索引下所有数据
POST /mydb/_search
# 查询姓名为”张三“的用户
POST /mydb/_doc/_search
{
"query":{
"match":{
"name":"张三"
}
}
}
# 查询年龄=20的用户 term同上面的match比较,match会使用分词器解析,计算分数score,而term是直接精确查询。
POST /mydb/_doc/_search
{
"query":{
"term":{
"age":"20"
}
}
}
# 查询姓名为”张三“的用户,用 _source 过滤查询结果
POST /mydb/_doc/_search
{
"query":{
"match":{
"name":"张三"
}
},
"_source":["name","age"]
}
# 查询所有用户,用 age 排序
POST /mydb/_doc/_search
{
"sort":[
{
"age":{
"order":"asc"
}
}
]
}
# 分页查询 from 开始页数,size 返回条数
POST /mydb/_doc/_search
{
"sort":[
{
"age":{
"order":"asc"
}
}
],
"from":0,
"size":1
}
# 多条件查询 must (and)
POST /mydb/_doc/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"张三"
}
},
{
"match":{
"age":"30"
}
}
]
}
}
}
# 多条件查询 should (or)
POST /mydb/_doc/_search
{
"query":{
"bool":{
"should":[
{
"match":{
"name":"张三"
}
},
{
"match":{
"age":"30"
}
}
]
}
}
}
# 多条件查询 must_not (not)
POST /mydb/_doc/_search
{
"query":{
"bool":{
"must_not":[
{
"match":{
"name":"张三"
}
}
]
}
}
}
# 过滤器 gt(>) gte(>=) lt(<) lte(<=)
POST /mydb/_doc/_search
{
"query":{
"bool":{
"filter":[
{
"range":{
"age":{
"gt":"25"
}
}
}
]
}
}
}
# 多次查询 可以查出 浦东 徐汇的 这里会根据关键字计算score,匹配高的排前面
POST /mydb/_doc/_search
{
"query":{
"match":{
"address":"浦东 徐汇"
}
}
}
# 高亮查询
POST /mydb/_doc/_search
{
"query":{
"match":{
"address":"上海"
}
},
"highlight":{
"fields":{
"address":{}
}
}
}