Elasticsearch入门级介绍
术语介绍
- 文档 Document:用户存储在es 中的数据文档,es中存储的最小单元,类似于MySQL表中的一行数据
- 索引 Index:由具有相同字段的文档列表组成,表示一个文档的集合,类似于table,在6.0后一个Index下只有一个type。(在6后的版本会把type去除)
- 节点 Node:一个Elasticsearch的运行实例,是集群的构成单元
- 集群 Cluster:由一个或多个节点组成,对外提供服务
Document
Json Object,由字段(Field)组成,常见数据类型如下:
-
字符串:text, keyword
-
数值型:long, integer, short, byte, double, float, half_float, scaled_float
-
布尔:boolean
-
日期:date
-
二进制:binary
-
范围类型:integer_range, float_range, long_range, double_range, date_range
每一个文档都有唯一的id标识
- 自行指定
- es自动生成
Demo
93.180.71.3 --[17/May/2019:08:21:02 +0000] "GET/downloads/product_1 HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"
以上日志记录到es 后:
{
"remote_ip":"93.180.71.3",
"user_name":"-",
"@timestamp":"2019-05-17T08:21:02.000Z",
"request_action":"GET",
"request":"/downloads/product_1",
"http_version":"1.1",
"response":"304",
"bytes":"0",
"referrer":"-",
"agent":"Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"
}
MetaData(元数据),用于标注文档的相关信息
- _index:文档所在的索引名
- _type:文档所在的类型名
- _id:文档唯一id
- _uid:组合id,由 _type和 _id组成(6.x _type不再起作用,这里同_id一样)
- _source:文档的原始Json数据,可以从这里获取每个字段的内容
- _all:整合所有字段内容到该字段,默认禁用(很占磁盘空间)
Index
- 索引中存储具有相同结构的文档(Document);每个索引都有自己的mapping定义,用于定义字段名和类型
- 一个集群可以有多个索引,比如:nginx日志存储的时候可以按照日期每天生成一个索引来存储
– nginx-log-2019-01-01
– nginx-log-2019-01-02
– nginx-log-2019-01-03
如何创建索引和写入数据
Rest API
Elasticsearch 集群对外提供 RESTful API
- REST – REpresentational State Transfer
- URI 指定资源,如 Index、Document 等
- Http Method 指明资源操作类型,如 GET、POST、PUT、DELETE等
常用两种交互方式
-
Curl 命令行
curl -X PUT 'http://localhost:9200/employee/doc/1' -i -H "Content-Type: application/json" -d '{ "username": "bear" "job": "php" }'
-
Kibana DevTools
Index API
用于创建、更新、删除索引配置等
-
创建索引如下:
PUT /user_index
-
查看现有索引
GET _cat/indices
-
删除索引如下:
DELETE /user_index
Document API
Elasticsearch 有专门的 Document API
-
创建文档
1、指定 id 创建文档(【创建文档时,如果索引不存在,es会自动创建对应的index(test_index)和type(doc)】PUT /test_index/doc/1 { "username": "bear", "job": "php" }
2、不指定 id 创建文档POST /test_index/doc { "username": "tom", "job": "java" }
3、批量创建文档API — es允许一次创建多个文档,从而减少网络传输开销,提升写入速率;-endpoint为【_bulk】,bulk 每一行都是一个Json,第一行指定了操作的原始信息,如下:
其中:【index(创建文档当文档已存在会覆盖)、create(创建文档当文档已存在会报错)、delete、update】属于action_type(操作要做什么)POST _bulk {"index":{"_index":"test_index","_type":"doc","_id":"2"}} {"username":"hebe","job":"web"} {"delete":{"_index":"test_index","_type":"doc","_id":"1"}} {"update":{"_index":"test_index","_type":"doc","_id":"2"}} {"doc":{"job":"web-vue"}} POST my_index/doc/_bulk { "index":{ "_id": "1" } } { "username": "alfred way", "job": "java", "age": 18, "birth": "1990-02-02", "isMarried": false } { "index":{ "_id": "2" } } { "username": "alfred", "job": "java and php specialist", "age": 28, "birth": "1990-02-02", "isMarried": true }
返回信息: { "took": 21, "errors": false, //批量操作是否成功 "items": [ //每个bulk操作的返回结果 { "index": { "_index": "test_index", "_type": "doc", "_id": "2", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": true, "status": 201 } }, { "delete": { "found": true, "_index": "test_index", "_type": "doc", "_id": "1", "_version": 2, "result": "deleted", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "status": 200 } }, { "update": { "_index": "test_index", "_type": "doc", "_id": "2", "_version": 2, "result": "updated", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "status": 200 } } ] }
-
查询文档
1、指定要查询的文档idGET /test_index/doc/1
查询存在时:其中【_source存储了文档完整的原始数据】
查询未找到时:
2、搜索所有文档,用到【_search】,查询语句,Json格式,放在http_body中发送到es:GET /test_index/doc/_search { "query":{ "term":{ "_id":"1" } } }
返回说明:{ "took": 3, //查询耗时,单位ms "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, //符合条件的总文档数 "max_score": 1, "hits": [ //返回的文档详情数据数组,默认前10个文档 { "_index": "test_index", //索引名 "_type": "doc", "_id": "1", //文档id "_score": 1, //文档的得分 "_source": { //文档详情 "username": "bear", "job": "php" } } ] } }
3、批量查询文档API — es允许一次查询多个文档;-endpoint为【_mget】,可获取不同 index 的文档,如下:
GET /_mget { "docs":[ { "_index":"test_index", "_type":"doc", "_id":"1" }, { "_index":"test_index", "_type":"doc", "_id":"2" } ] }