前戏
主要的基础概念有:Node, Index,Type,Document,Field,shard和replicas.
Node(节点):运行单个ES实例的服务器
Cluster(集群):一个或多个节点构成集群
Index(索引):索引是多个文档的集合
Type(类型):一个Index可以定义一种或多种类型,将Document逻辑分组
Document(文档):Index里每条记录称为Document,若干文档构建一个Index
Field(字段):ES存储的最小单元
Shards(分片):ES将Index分为若干份,每一份就是一个分片
Replicas(副本):Index的一份或多份副本
为了便于理解,我们和系型数据库做一个对比:
关系型数据库(如mysql,oracle等) | elasticsearch |
database或schema | index |
table | type |
row | document |
column或field | field |
ES是分布式搜索引擎,每个索引有一个或多个分片(shard),索引的数据被分配到各个分片上。你可以看作是一份数据分成了多份给不同的节点。
当ES集群增加或删除节点时,shard会在多个节点中均衡分配。默认是5个primary shard(主分片)和1个replica shard(副本,用于容错)。
ES基础API操作
什么是API?
API(Application Programming Interface)应用程序编程接口,就是无需访问程序源码或理解内部工作机制就能实现一些相关功能的接口。
RestFul API 格式
curl -X<verb> ‘<protocol>://<host>:<port>/<path>?<query_string>’-d ‘<body>’
参数 | 描述 |
verb | HTTP方法,比如GET、POST、PUT、HEAD、DELETE |
host | ES集群中的任意节点主机名 |
port | ES HTTP服务端口,默认9200 |
path | 索引路径 |
query_string | 可选的查询请求参数。例如?pretty参数将返回JSON格式数据 |
-d | 里面放一个GET的JSON格式请求主体 |
body | 自己写的 JSON格式的请求主体 |
elasticseearch的API很多, 我们运维人员主要用到以下几个要介绍的较简单的API。
更多API参考: https://www.elastic.co/guide/en/elasticsearch/reference/6.2/index.html
查看节点信息
通过curl或浏览器访问http://192.168.100.40:9200/_cat/nodes?v(ip为ES节点IP,如果有ES集群,则为ES任意节点IP)
查看索引信息
通过curl或浏览器访问http://192.168.100.40:9200/_cat/indices?v
新增索引
[root@test1 ~]# curl -X PUT http://192.168.100.40:9200/test_index
{"acknowledged":true,"shards_acknowledged":true,"index":"test_index"}[root@test1 ~]#
[root@test1 ~]# curl http://192.168.100.40:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open test_index NZIMDUzzQ6-eRdATRVODbw 5 1 0 0 1.1kb 460b
[root@test1 ~]#
green:所有的主分片和副本分片都已分配。你的集群是100%可用的。
yellow:所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。如果 更多的 分片消失,你就会丢数据了。把 yellow 想象成一个需要及时调查的警告。
red:至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。
删除索引
curl -X DELETE http://192.168.100.40:9200/test_index
ES查询语句
ES提供一种可用于执行查询JSON式的语言,被称为Query DSL。
针对elasticsearch的操作,可以分为增、删、改、查四个动作。
查询匹配条件:
- match_all
- from,size
- match
- bool
- range
查询应用案例:
导入数据源
使用官方提供的示例数据:
1, 下载并导入进elasticsearch
[root@test2 ~]# wget https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/resources/accounts.json
导入进elasticsearch
[root@test2 ~]# curl -H "Content-Type: application/json" -XPOST "192.168.100.40:9200/bank/_doc/_bulk?pretty&refresh" --data-binary "@accounts.json"
curl -H "Content-Type: application/json" -XPOST "10.1.1.12:9200/bank/_doc/_bulk?pretty&refresh" --data-binary "@accounts.json"
查询确认
[root@test2 ~]# curl http://192.168.100.41:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open bank DejnYeioQFe3KxhRBlq6og 5 1 1000 0 949.3kb 474.6kb
查询bank索引的数据(使用查询字符串进行查询)
curl -X GET "192.168.100.40:9200/bank/_search?q=*&sort=account_number:asc&pretty"
说明:
默认结果为10条
_search 属于一类API,用于执行查询操作
q=* ES批量索引中的所有文档
sort=account_number:asc 表示根据account_number按升序对结果排序
pretty调整显示格式
查询bank索引的数据 (使用json格式进行查询)
curl -X GET "192.168.100.40:9200/bank/_search" -H 'Content-Type: application/json' -d'{
> "query": { "match_all": {} },
> "sort": [
> { "account_number": "asc" }
> ]
> }
> '
注意: 最后为单引号
持续更新!!!