Elasticsearch基础
Docker安装Elasticsearch和Kibana请参考:https://www.jianshu.com/p/804fe0fa6702
1、_cat:
_cat/nodes:查看节点信息
es1.jpg
_cat/health:查看健康状况
es2.jpg
_cat/master:主节点信息
es3.jpg
_cat/indices:查看elasticsearch所有索引(索引可类比MySQL的数据库)
es4.jpg
2、索引一个文档
“索引一个文档”(用MySQL的话来讲,就是插入一条记录),需要指定索引的类型(就是指定哪个库的哪张表)
2.1、PUT
PUT可以新增也可以修改。PUT必须指定id;由于PUT需要指定id,我们一般用来做修改操作,不指定id会报错。
PUT test/basics/1 插入test索引下,basics类型中,1号数据。
PUT test/basics/1
{
"name":"Jessie"
}
es5.jpg
返回数据中,_index代表索引(类比数据库),_type代表类型(类比表)。如果相同的请求,发送第二次,result就会变成"updated"。
2.2、POST
POST新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号;
es6.jpg
3、查询文档
GET /test/basics/1
http://192.168.43.129:9200/test/basics/1
{
"_index": "test",//在哪个索引
"_type": "basics",//在哪个类型
"_id": "1",//记录id
"_version": 1,//版本号
"_seq_no": 0,//并发控制字段,每次更新都会+1,用来做乐观锁
"_primary_term": 1,//同上,主分片重新分配,如重启,就会变化
"found": true,
"_source": {
"name": "Jessie"
}
}
通过“if_seq_no=0&if_primary_term=1 ”,当序列号匹配的时候,才进行修改,否则不修改。
PUT /test/basics/1?if_seq_no=0&if_primary_term=1
若seq_no不匹配,则更新失败。现在已经修改过id = 1这条数据,并且_seq_no为3,此时,再发上面的请求,就会返回修改失败。
es8.jpg
4、更新文档
4.1、POST更新文档,带有_update
POST /test/basics/1/_update
更新数据时,会和原来的数据进行对比,如果数据相同,则不会执行更新操作,此时再次发送相同的请求,则不执行任何操作,序列号也不发生变化。
4.2、POST更新文档,不带_update
POST /test/basics/1
在更新过程中,重复执行更新操作,数据也能够更新成功,不会和原来的数据进行对比。
4.3、PUT更新文档
PUT /test/basics/1
和POST不带_update执行更新操作一样,不会和原来数据进行对比,如果重复执行更新操作,_seq_no增加。
5、删除索引、文档
在Elasticsearch中,没有删除类型(类比MySQL中的表)操作,只能删除索引和文档。
删除文档:DELETE /test/basics/1
http://192.168.43.129:9200/test/basics/1
{
"_index": "test",
"_type": "basics",
"_id": "1",
"_version": 6,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 7,
"_primary_term": 3
}
删除索引:DELETE /test
http://192.168.43.129:9200/test
{
"acknowledged": true
}
6、bulk批量操作
批量操作无法使用Postman测试,使用kibana执行测试数据。
1、进入Kibana的Dev Tools
访问http://{你的虚拟机地址}:5601,进入Kibana,然后点击左上角选项按钮,找到Dev Tools
2、执行批量操作
测试数据来自:https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json,全选,复制到Kibana中的Dev Tools执行即可。
POST bank/account/_bulk
es13.jpg
7、mapping映射
Maping是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和索引的。
7.1、创建映射
这里将email的type设为keyword,指定email字段只能精准匹配,不会进行分词以及全文匹配。而name字段的type为text,会进行分词以及全文匹配。建议将需要进行过滤、聚合等操作的字段设定为keyword,而一些长文本信息设定为text。
PUT /my_index
{
"mappings": {
"properties": {
"age": {
"type": "integer"
},
"email": {
"type": "keyword"
},
"name": {
"type": "text"
}
}
}
}
执行结果:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "my_index"
}
7.2、查看映射
GET /my_index/_mapping
执行结果:
{
"my_index" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "integer"
},
"email" : {
"type" : "keyword"
},
"name" : {
"type" : "text"
}
}
}
}
}
7.3、添加新的字段映射
PUT /my_index/_mapping
{
"properties": {
"employee-id": {
"type": "keyword",
"index": false
}
}
}
这里的 “index”: false,表明新增的字段不能被检索,只是一个冗余字段。
7.4、更新映射
对于已经存在的字段映射,我们不能更新。更新必须创建新的索引,进行数据迁移。
例如要将my_index中age字段的类型改为long。
1、创建新的索引:new_my_index
PUT /new_my_index
{
"mappings": {
"properties" : {
"age" : {
"type" : "long"
},
"email" : {
"type" : "keyword"
},
"employee-id" : {
"type" : "keyword",
"index" : false
},
"name" : {
"type" : "text"
}
}
}
}
2、查看new_my_index的映射
GET /new_my_index/_mapping
执行结果:
{
"new_my_index" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"email" : {
"type" : "keyword"
},
"employee-id" : {
"type" : "keyword",
"index" : false
},
"name" : {
"type" : "text"
}
}
}
}
}
3、将my_index中的数据迁移到new_my_index中
先在my_index中插入一条数据:
POST /my_index/_doc
{
"age": 20,
"name": "Jessie",
"email": "Jessie@qq.com",
"employee-id": 1
}
迁移数据:
POST _reindex
{
"source": {
"index": "my_index",
"type": "_doc"
},
"dest": {
"index": "new_my_index"
}
}
执行结果:
#! Deprecation: [types removal] Specifying types in reindex requests is deprecated.
{
"took" : 579,
"timed_out" : false,
"total" : 1,
"updated" : 0,
"created" : 1,
"deleted" : 0,
"batches" : 1,
"version_conflicts" : 0,
"noops" : 0,
"retries" : {
"bulk" : 0,
"search" : 0
},
"throttled_millis" : 0,
"requests_per_second" : -1.0,
"throttled_until_millis" : 0,
"failures" : [ ]
}
4、查看new_my_index中的数据
GET /new_my_index/_search
执行结果:
{
"took" : 6,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "new_my_index",
"_type" : "_doc",
"_id" : "30MpLncBO375z1z5rMtJ",
"_score" : 1.0,
"_source" : {
"age" : 20,
"name" : "Jessie",
"email" : "Jessie@qq.com",
"employee-id" : 1
}
}
]
}
}