ES:elasticsearch基本用法
官方文档:https://www.elastic.co/cn/elasticsearch/
一:名词介绍
一个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":{} } } }