es基本原理及使用kibana操作es的常见命令
一、es的基本原理与基础概念
1.1 倒排索引
倒排索引
源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted
index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
如图
1.2 索引 index
一个索引就是一个拥有几分相似特征的文档的集合。比如说,可以有一个客户 数据的索引,另一个产品目录的索引,还有一个订单数据的索引
一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应 于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字
类似于mysql中的库的概念,不同的是es的数据是存于索引,mysql是存于库下面的表
1.3 集群Cluster
一个集群就是由一个或多个服务器节点组织在一起,共同持有整个的数据,并一起提供索引和搜索功能。一个Elasticsearch集群有一个唯一的名字标识,这个名字默认就是”elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。
1.4 节点Node
集群中包含很多服务器,一个节点就是其中的一个服务器。作为集群的一部分,它存储数据,参与集群的索引和搜索功能
1.5 分片
分片一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文
档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点 处理搜索请求,响应太慢 为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫 做分片当创建一个索引的时候,可以指定你想要的分片的数量 每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置 到集群中的任何节点上 分片很重要,主要有两方面的原因
1.允许水平分割/扩展你的内容容量
2.允许在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量
原则:分片数要配置成集群节点数的倍数,且不超过3倍,业务索引每个分片不超过30GB。
1.6 副本
在一个网络 /
云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片(副本)。
副本之所以重要,有两个主要原因 1) 在分片/节点失败的情况下,提供了高可用性。
注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非 常重要的 2)
扩展搜索量/吞吐量,因为搜索可以在所有的副本上并行运行 每个索引可以被分成多个分片。一个索引有0个或者多个副本
一旦设置了副本,每个索引就有了主分片和副本分片,分片和副本的数量可以 在索引
在索引创建之后,可以在任何时候动态地改变副本的数量,但是不能改变分片的数量,也就是创建索引的时候就创建分片
例如:某es集群有3个节点
PUT eslog
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
}
}
1.7 映射(Mapping)
mapping是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、分析器、是否被索引等等。这些都是映射里面可以设置的,其它就是处理ES里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。
GET my_index/_mapping
设置
创建新的索引并设置mapping信息
PUT user
{
"mappings": {
"properties": {
"address": {
"type": "text",
"index": false
},
"age": {
"type": "long"
},
"name": {
"type": "text"
}
}
}
二、使用kibana操作es的常见命令
2.1 基础命令
#所有节点
GET /_cat/nodes/
#查看主节点GET /_cat/master
#查看健康状况GET /_cat/health
#查看所有索引GET /_cat/indices
#查看所有索引及数据量GET /_cat/indices?v
#查看索引数据GET /eslog/_search
结果说明:
#查看分词器装没有
#最大分词
GET _analyze { "analyzer":"ik_max_word", "text":"我是中国人" }
#最小分词
GET _analyze { "analyzer":"ik_smart", "text":"我是中国人" }
#所有节点
GET /_cat/nodes/
dilmrt代表全部权限
添加索引PUT /eslog
删除索引DELETE /eslog
查看索引GET /eslog
2.2 索引数据的操作
2.2.1 建立索引并插入数据
创建索引,并插入数据
PUT /eslog
PUT /eslog/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "广州天河公园"
}
PUT /eslog/_doc/2
{ "name": "李四",
"sex": 1,
"age": 28,
"address": "广州荔湾大厦"
}
PUT /eslog/_doc/3
{ "name": "王五",
"sex": 0,
"age": 26,
"address": "广州白云山公园"
}
PUT /eslog/_doc/4
{ "name": "admin",
"sex": 0,
"age": 22,
"address": "长沙橘子洲头" }
PUT /eslog/_doc/5
{ "name": "小明",
"sex": 0,
"age": 19,
"address": "长沙岳麓山"
}
POST /eslog/_doc
{ "name": "长沙",
"sex": 0,
"age": 19,
"address": "长沙岳麓山"
}
2.22 索引数据的增删改查
1、当前索引 doc类型的所有文档
GET /eslog/_doc/_search
格式:
GET /索引名称/类型/_search
举例:
GET /eslog/_doc/_search
类似:
SQL: select * from eslog
#2、条件查询, 如要查询age等于28岁的 _search?q=:**
GET /eslog/_doc/_search?q=age:25
格式:
GET /索引名称/类型/_search?q=:**
举例:
GET /es_db/_doc/_search?q=age:28
类似:
SQL: select * from student where age = 28
3、范围查询, 如要查询age在25至26岁之间的 _search?q=[
**
TO**
] 注 意: TO 必须为大写
GET /eslog/_doc/_search?q=age[25 TO 26]
格式:
GET /索引名称/类型/_search?q=***[25 TO 26]
举例:
GET /es_db/_doc/_search?q=age[25 TO 26]
类似:
SQL: select * from student where age between 25 and 26
4、根据多个ID进行批量查询 _mget ,注意:这里的id是指es的生成的id(若未指定)不是数据里的id
GET /eslog/_doc/_mget { "ids":["3","2"] }
格式:
GET /索引名称/类型/_mget
举例:
GET /es_db/_doc/_mget { “ids”:[“1”,“2”] }
类似:
SQL: select * from student where id in (1,2)
5、查询年龄小于等于28岁的 :<= (同理:>,<,>=,<=)
GET /eslog/_doc/_search?q=age:<=28
格式:
GET /索引名称/类型/_search?q=age:<=**
举例:
GET /es_db/_doc/_search?q=age:<=28
类似:
SQL: select * from student where age <= 28
6、分页查询 from=&size= (注意:from+size不能超过10000(默认值,可以手动修改))
GET /eslog/_doc/_search?q=age[25 TO 26]&from=0&size=1
格式:
GET /索引名称/类型/_search?q=age[25 TO 26]&from=0&size=1
举例:
GET/es_db/_doc/_search?q=age[25 TO 26]&from=0&size=1
类似:
SQL: select * from student where age between 25 and 26 limit 0, 1
7、对查询结果只输出某些字段 _source=字段,字段
GET /eslog/_doc/_search?_source=name,age
格式:
GET /索引名称/类型/_search?_source=字段,字段
举例:
GET /es_db/_doc/_search?_source=name,age
类似:
SQL: select name,age from student
8、对查询结果排序 sort=字段:desc/asc
GET /eslog/_doc/_search?sort=age:asc
格式:
GET /索引名称/类型/_search?sort=字段 desc
类似:
SQL: select * from student order by age desc
2.23 DSL语言高级查询
1、
term
根据名称精确查询姓名 term, term查询不会对字段进行分词查询,会 采用精确匹配 注意: 采用term精确查询, 查询字段映射类型属于为keyword
POST /eslog/_doc/_search {
"query":
{ "term":
{
"name": "admin"
}
}
}
类似: SQL: select * from student where name = 'admin'
1.1 多关键字精确查询
POST /eslog/_search
{
"query": {
"terms": {
"name": ["zhangsan","lisi"]
}
}
}
类似: SQL: select * from student where name in ('zhangsan','lisi')
2、
match
根据备注信息模糊查询 match, match会根据该字段的分词器,进行分 词查询
POST /eslog/_doc/_search
{
"from": 0,
"size": 2,
"query": {
"match": {
"address": "广州天"
}
}
}
类似: SQL: select * from user where address like '%广州%' limit 0, 2
3、
multi_match
多字段模糊匹配查询与精准查询 multi_match
POST /eslog/_doc/_search
{
"query":{
"multi_match":{
"query":"长沙",
"fields":["address","name"]
}
}
}
类似:SQL: select * from student where name like '%张三%' or address like '%张 三%'
注:json请求字符串中部分字段的含义
range:范围关键字
gte 大于等于
lte 小于等于
gt 大于
lt 小于
now 当前时间
range
范围查询
POST /eslog/_doc/_search
{
"query" : {
"range" : {
"age" : {
"gte":25,
"lte":28
}
}
}
}
类似于:SQL: select * from user where age between 25 and 28
5.
from+ size
分页、输出字段、排序综合查询
POST /eslog/_doc/_search
{
"query" : {
"range" : {
"age" : {
"gte":25,
"lte":28
}
}
},
"from": 0,
"size": 2,
"_source": ["name", "age", "book"],
"sort": {"age":"desc"}
}
filter
过滤器方式查询,它的查询不会计算相关性分值,也不会对结果 进行排序, 因此效率会高一点,查询的结果可以被缓存。
POST /eslog/_doc/_search
{
"query" : {
"bool" : {
"filter" : {
"term":{
"age":25
}
}
}
}
}
_delete_by_query
按条件删除
POST eslog/_delete_by_query
{
"query":{
"match":{
"sensorName":"一体化设备"
}
}
}
8.
bool/filter/range
复杂删除里面的条件跟查询条件一样的,例如按时间范围删除
POST eslog/_delete_by_query
{
"query":{
"bool":{
"filter":[
{
"range":{
"loginTimeMills":{
"from":1628004803000,
"to":1629957806000
}
}
}
]
}
}
}
keyword 与 text 映射类型的区别
将 book 字段设置为 keyword 映射 (只能精准查询, 不能分词查询,能聚合、 排序、过滤)将 book 字段设置为 text 映射 (能模糊查询, 能分词查询,不能聚合、排 序)。
#查看es索引字段的类型(keyword或者text)
GET /eslog/_mapping?pretty
9.过滤返回字段
includes:来指定想要显示的字段
excludes:来指定不想要显示的字段
POST /eslog/_search{
"_source": {
"includes": ["name","nickname"]
},
"query": {
"terms": {
"nickname": ["zhangsan"]
}
}
}
10 .
bool
组合查询bool
把各种其它查询通过must
(必须 )、must_not
(必须不)、should
(应该)的方式进行组合
POST /student/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "zhangsan"
}
}
],
"must_not": [
{
"match": {
"age": "40"
}
}
],
"should": [
{
"match": {
"sex": "男"
}
}
]
}
}
}