我们操作Elasticsearch 是通过它提供的REST API来进行的,我们可以用web客户端(POST MAN等)或者curl命令来与Elasticsearch 进行交互
Elasticsearch 的REST请求和响应的内容基本都是JSON格式的
官方的API文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html
下面简单介绍下curl命令的用法
curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。
不带有任何参数时,curl 就是发出 GET 请求。
例:
curl www.baidu.com
相当于向www.baidu.com发出 GET 请求,服务器返回的内容会在命令行输出。
-X:-X参数指定 HTTP 请求的方法。
curl -X POST www.baidu.com
-H
-H参数添加 HTTP 请求的标头。
例:我们想发送json格式的数据时,就需要指定请求的Content-Type为 application/json,如下
curl -d '{"name": "xxx", "pass": "123"}' -H 'Content-Type: application/json' https://www.baidu.com
-d:-d参数用于发送 POST 请求的数据体。
例:
curl https://www.baidu.com/ -d 'name=xxx&password=xxx'
使用-d参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略-X POST。
-o:-o参数将服务器的回应保存成文件,等同于wget命令,-o后为我们定义的文件名,即我们下载的文件保存的文件名
例:
curl -o baidu.html https://www.baidu.com
-O:-O参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。
例:
curl -O https://www.baidu.com/baidu.html
1、查看Elasticsearch 系统的基本信息
想要查看Elasticsearch 系统的基本信息,只需要访问http://ip:9200 即可,返回的是本节点(ES实例的)name,以及ES集群的一些基本信息,如集群名,版本信息等。
如:
//本地ES系统信息
http://localhost:9200
或者
curl http://localhost:9200
以下为我本地ES的基本信息
{
"name" : "WJjbQcr",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "FL0-U6IPTESykqutT1Lt4A",
"version" : {
"number" : "6.2.2",
"build_hash" : "10b1edd",
"build_date" : "2018-02-16T19:01:30.685723Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
2、查看集群健康信息
curl -X GET "localhost:9200/_cat/health?v"
该指令会返回集群名称,状态,节点数,分片数等。其中状态有green、yellow和red,green表示正常。yellow表示集群所有数据都是可用的,集群功能也齐全,不过某些复制没有被分配。
curl -X GET "localhost:9200/_cat/nodes?v"
该指令会返回节点的名称,节点ip,是否为主节点(主节点的master会显示为*)
请求结果如下:
指令如下:
curl -X GET "localhost:9200/_cat/indices?v"
如果返回:health status index uuid pri rep docs.count docs.deleted store.size pri.store.size,表示当前集群没有索引
5、创建一个索引
指令如下,使用的请求方式为PUT,然后在ip地址后填写我们想创建的索引的名称,即会创建相应名称的索引
例:
curl -X PUT "localhost:9200/test"
创建成功会给我们返回响应,响应结果有index名称,响应标识,true为成功
以下为我创建一个名为test的索引返回的结果
E:\soft\elasticsearch-6.2.2\bin>curl -X PUT "localhost:9200/test"
{"acknowledged":true,"shards_acknowledged":true,"index":"test"}
如果我们想更直观的查看响应的结果,那么我们可以在指令地址后面加上pretty参数,这样响应的结果就会以json格式输出
例:
curl -X PUT "localhost:9200/test?pretty"
mapping是类似于数据库中的表结构定义,主要作用如下:
定义index下的字段名
定义字段类型,比如数值型、浮点型、布尔型等
定义倒排索引相关的设置,比如是否索引、记录position等
我们可以在创建索引的时候设置mapping
比如
PUT localhost:9200/my_index
{
"mappings": {
"doc": {
"dynamic": false,
"properties": {
"title": {
"type": "text"
}
}
}
}
}
注:mappings的下一层为类型的名称,如上面的例子则表示在doc类型下创建一个类型为text的字段
6、删除索引
指令如下,使用的请求方式为DELETE ,然后在ip地址后填写我们想删除的索引的名称,即会删除相应名称的索引
curl -X DELETE "localhost:9200/test?pretty"
结果
E:\soft\elasticsearch-6.2.2\bin>curl -X DELETE "localhost:9200/test?pretty"
{
"acknowledged" : true
}
7、添加文档
例:
在postman发送请求
以下请求表示在索引test中的test_type类型中添加一个文档,文档id为1,json中为文档内容
我们也可以不指定ID,不指定ID的话,ES会帮我们生成一个ID,自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式系统并行生成时不可能会发生冲突。不指定ID需要使用POST请求,当然指定ID也可以使用POST请求。
返回结果:
{
"_index": "test",
"_type": "test_type",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
注:es中创建后的mapping不可修改
8、查看文档
查看文档只需要使用GET请求去请求ip地址加上我们的索引名称,类型,文档id即可
E:\soft\elasticsearch-6.2.2\bin>curl -X GET "localhost:9200/test/test_type/1?pretty"
{
"_index" : "test",
"_type" : "test_type",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"user" : "m"
}
}
文档主要属性:
_index:文档所在的索引
_type:文档所在的类型
_id:文档的ID,唯一标识
如果我们想查看索引中的相关属性,那么直接GET请求ip地址加索引名称即可,它会返回索引的aliases属性、mapping属性和settings属性
curl -X GET "localhost:9200/test?pretty"
返回结果:
{
"test" : {
"aliases" : { },
"mappings" : {
"test_type" : {
"properties" : {
"age" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"user" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
},
"settings" : {
"index" : {
"creation_date" : "1600854236811",
"number_of_shards" : "5",
"number_of_replicas" : "1",
"uuid" : "uHWQNne2T0aHT4k32_mzVw",
"version" : {
"created" : "6020299"
},
"provided_name" : "test"
}
}
}
}
9、删除文档
删除使用DELETE请求即可,下面为删除id为2的文档,使用DELETE请求,我们不仅可以删除文档,还可以删除整个type乃至整个索引
#删除id为2的文档
curl -XDELETE “localhost:9200/test/test_type/2”
#删除索引
curl -XDELETE “localhost:9200/test”
10、全文搜索
搜索方法为_search
我们可以在url的ES类型后加上_search,这样就会返回该类型下的所有数据
curl -XGET "localhost:9200/test/test_type/_search?pretty"
_search还支持很多种搜索方式,我们使用querystring语法进行搜索
例:搜索包含m的数据
curl -XGET "localhost:9200/test/test_type/_search?pretty&q=m"
querystring语法(上例中,?q=后面写的就是querystring语法):
全文检索:直接写搜索的单词,例如加上例中的m
单字段的全文检索:在搜索单词前加上字段名和冒号,比如,如果知道单词m肯定出现在user字段,可以写作user:m
单字段的精确检索:在搜索单词前后加上双引号,比如user:“fjc”
多个检索条件的组合:可以使用NOT、AND和OR来组合检索,注意必须是大写
字段是否存在:exists:user表示要求user字段存在,missing:user表示要求user字段不存在
通配符:用?表示单字母,*表示任意个字母
近似搜索:用表示搜索单词可能有一两个字母写得不对,请Elasticsearch按照相似度返回结果。比如test
范围搜索:对数值和时间,Elasticsearch都可以使用范围搜索,比如:rtt>300、date:[“now-6h” TO “now”}等。其中,[]表示端点数值包含在范围内,{}表示端点数值不包含在范围内
11、更新文档数据
更新某个文档使用_update方法
发送的json数据为
{
“doc”:{
“字段”:”新的数据”
}
}
例:
POST test/type1/1/_update
{
"doc" : {
"name" : "new_name"
}
}
需要注意的是,Elasticsearch底层并不支持更新操作,所谓的更新,是将旧的文档删除,然后索引一个新的文档。
除了使用doc来更新文档,我们还可以使用一些脚本来更新文档
{
"script" : "ctx._source.user= mm"
}
ctx._source表示当前被更新的文档,后面跟的是更新的字段,然后将新值赋给字段
例
POST test/type1/1/_update
{
"script" : {
"script" : "ctx._source.user= mm"
}
}
12、查看插件信息
使用GET请求访问/_cat/plugins?v,可以查看ES中的插件信息
curl -XGET "localhost:9200/_cat/plugins?v"
13、查看mapping信息
语法:GET 索引名/_mapping
例
GET test/_mapping
14、添加mapping
mapping的添加使用_mapping方法
POST 索引名/类型名/_mapping
{
mapping内容
}
注:类型名可有可无,在url指定了类型,则在mapping内容不需要显式写类型名
例:
POST test_index/test_type/_mapping
{
"test_type": {
"dynamic": false,
"properties": {
"name": {
"type": "text"
},
"address": {
"type": "text"
}
}
注:因为我们在url中指定了类型,所以内容中的test_type是可以不写的
Elasticsearch的RESTful API还有很多,这里不能一个一个列举了,大家需要了解更多看官方文档即可