二、es基本语法操作示例
前面我们已经成功搭建了单机的es环境,并学会了简单使用es的可视化页面工具kibana,是时候用它来练习es语法了。文档型数据库的优势是存储的灵活性,以及单次随机查询的性能较好,例如:mongoDB,相伴随而来的就是其非常难掌握的s一样的语法,因此不感兴趣的就可以不用往下看了,等用到的时候再补充。
es的一些概念和原理我就不说了,百度百度都能有,我自己也是半吊子说不清楚。es的语法涉及到的细节也非常多,我就增删改查这些基本的功能写个简单版本,以备以后用到时好快速上手。好了打开kibana的dev tools,我们来愉快的coding吧。
2.1 用户名和密码[可跳过]
// 列出所有索引
GET /_cat/indices?v
根据此处提示查看相关的官方文档,提示我们安全级别过低,需要创建用户名密码,其实这步可以跳过不管,直接进入2.2。
Security APIs | Elasticsearch Guide [7.16] | Elastic
2.1.1 修改配置
根据文档指示,修改配置文件如下
//es配置
network.host: 0.0.0.0
xpack.security.enabled: true
discovery.type: single-node
// kibana配置 新建文件/root/docker/kibana/config/kibana.yml
server.host: "0.0.0.0"
elasticsearch.username: "kibana_system"
elasticsearch.password: "123456"
2.1.2 设置es密码
修改好配置后,重启es服务,设置密码为123456,命令见代码段,操作见下图
// 进入docker容器 修改所有密码为123456
docker exec -it es /bin/bash
./bin/elasticsearch-setup-passwords interactive
2.1.3 使用配置文件启动kibana
此处因为需要添加kibana账户,我们先前没有给kibana弄配置文件,因此需要重建下kibana的容器。
// 停止清除老的容器,使用如下命令启动kibana
docker run --name kibana --net elastic -p 5601:5601 \
-e "ELASTICSEARCH_HOSTS=http://es:9200" \
-v /root/docker/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \
-d docker.elastic.co/kibana/kibana:7.16.0
ps:官方文档中此处推荐使用的kibana-keystore设置密码方式,会导致页面无法访问但日志不报错,原因未知。
2.1.4 使用elastic/123456登录es和kibana
再次查看所有索引
2.2 索引
为了节省篇幅,json查询语句部分我都压缩成一行了,使用的话找个在线格式化工具就行了
2.2.1 创建索引
put /open-soft
2.2.2 开启和关闭索引
POST /open-soft/_close
POST /open-soft/_open
2.2.3 索引设置
put /open-soft/_settings {"refresh_interval":"2s"}
get /open-soft/_settings
2.2.4 索引映射
映射:定义每个字段的类型,所使用的分词器
get /open-soft/_mapping
put /open-soft/_mapping{"properties":{"name":{"type":"text"},"age":{"type":"integer"}}}
2.3 文档
2.3.1 查询和新增
get /open-soft/_doc/1
put /open-soft/_doc/1{"name":"cheng","age":30}
2.3.2 更新
新增的语法再执行一次,若存在相同id,则根据id重写文档,可以新增或者减少字段
put /open-soft/_doc/1{"name":"cheng1","age":31}
按文档的指定字段更新
post /open-soft/_update/1{"doc":{"name":"cheng2"}}
2.3.3 删除
delete /open-soft/_doc/1
2.4 数据检索_search
开始数据检索前我们还是要导入sample data以方便写查询语句,因为重装kibana时我es也重装了,所以这里需要重新导入一次。点击左侧边栏->点击Home->Try sample data->Sample flight data
2.4.1 分页
get kibana_sample_data_flights/_search{"from":100,"size":10,"query":{"match_all":{}}}
from:从第几条开始收集结果
size:一共收集返回几条
query match_all:相当于sql的where 1=1;
2.4.2 返回指定字段和排序
get kibana_sample_data_flights/_search{"query":{"match_all":{}},"_source":["FlightDelayMin","Origin"],"sort":[{"FlightDelayMin":"desc"},{"Origin":"asc"}]}
这句查询语句相当于Sql的 select FlightDelayMin, Origin from tb where 1=1 order by FlightDelayMin desc, Origin asc;
_source:指定查询返回的字段,字符串数组
sort:按指定字段排序,对象数组
2.5 基于词项的查询
前面的查询都是没有where条件的,基于词项的查询相当于对指定的词项(字段)作精确的匹配,类似sql语句中的 =、>、<、in、between、exists、like "xx%"等,学完这边,基本上类似mysql的大部分查询能力就都能实现了
2.5.1 term
get kibana_sample_data_flights/_search{"query":{"term":{"DestWeather":"Rain"}},"_source":"DestWeather"}
term:相当于等于号,查询语句为:where DestWeather = "Rain";
2.5.2 terms
get kibana_sample_data_flights/_search{"query":{"terms":{"DestWeather":["Rain","Sunny"]}},"_source":"DestWeather"}
terms:可以匹配多个字段的值,相当于in,查询语句为:where DestWeather in ("Rain", "Sunny");
2.5.3 range
get kibana_sample_data_flights/_search{"query":{"range":{"FlightDelayMin":{"gte":10,"lte":200}}},"_source":"FlightDelayMin"}
range是范围查询,相当于Sql的查询语句为 where FlightDelayMin >= 10 and FlightDelayMin <= 200; 或者 where FlightDelayMin between 10 and 20;
2.5.4 exists
get kibana_sample_data_flights/_search{"query":{"exists":{"field":"DestCountry"}}}
相当于 where DestCountry is not null
2.5.5 prefix
get kibana_sample_data_flights/_search{"query":{"prefix":{"DestCountry":"C"}}}
前缀查询,相当于 where DestCountry like "C%";
2.5.6 wildcard和regexp
通配符查询和正则匹配查询,因开销较大一般不建议首先使用
//通配符查询
get kibana_sample_data_flights/_search{"query":{"wildcard":{"Dest":"*Xi?an*"}}}
//正则表达式查询,只能匹配field为text的
getkibana_sample_data_flights/_search{"query":{"regexp":{"FlightNum":"[A-Za-z0-9]*W"}},"_source":"FlightNum"}