社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Elasticsearch

ElasticSearch之CURL操作

运维帮 • 7 年前 • 1033 次点击  

转自:https://www.cnblogs.com/jing1617/p/8060421.html


CURL的操作 

curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求。简单的认为是可以在命令行下面访问url的一个工具。在centos的默认库里面是有curl工具的,如果没有请yum安装即可。 

curl 
-X 指定http的请求方法 有HEAD GET POST PUT DELETE 
-d 指定要传输的数据 
-H 指定http请求头信息 


浏览ES服务器 
curl -XGET http://master:9200  <=> 在浏览器中访问 

创建索引库 
curl -XPUT http://master:9200/bigdata_p 
这样就在es中创建了一个索引库bigdata_p 
     
POST和PUT都可以用于创建,二者之间的区别: 
PUT是幂等方法,POST不是。所以PUT用户更新,POST用于新增比较合适。 

ES创建索引库和索引时的注意点 
1)索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号 
2)如果没有明确指定索引数据的ID,那么es会自动生成一个随机的ID,需要使用POST参数 
curl -XPOST http://localhost:9200/bigdata/product/ -d '{"author" : "Doug Cutting"}' 

往索引库中新增数据 
在具体的type里面,添加相关的document 
curl -XPUT http://master:9200/bigdata_p/product/ -d '{"name":"hadoop", "author": "Doug Cutting", "c_version": "2.7.3"}' 
    

查询某一个索引库中的数据 
查询整个索引库:curl -XGET http://master:9200/bigdata_p/_search?pretty 
在url后面加上一个pretty则会对返回结果进行格式化, 
查询某一个type:curl -XGET http://master:9200/bigdata_p/product/_search?pretty 
查询具体的一条记录:curl -XGET http://master:9200/bigdata_p/product/1?pretty 
查询一条索引文档中的具体的字段:curl -XGET http://master:9200/bigdata_p/product/1?_source=name&pretty 
 如果要查询多个字段,使用","进行隔开。eg. 
curl -XGET http://master:9200/bigdata_p/product/1?_source=name,author&pretty 
获取source所有数据 
curl -XGET http://master:9200/bigdata_p/product/1?_source&pretty 
根据条件进行查询 
curl -XGET http://master:9200/bigdata_p/product/_search?q=name:hbase,hive&pretty 
   

-------------------         
ES更新


ES可以使用PUT或者POST对文档进行更新,如果指定ID的文档已经存在,则执行更新操作 

注意:执行更新操作的时候,ES首先将旧的文档标记为删除状态,然后添加新的文档,旧的文 

档不会立即消失,但是你也无法访问,ES会继续添加更多数据的时候在后台清理已经标记为删 

除状态的文档。 
局部更新 
可以添加新字段或者更新已经存在字段(必须使用POST) 
curl -XPOST http://master:9200/bigdata_p/product/2/_update -d '{"doc":{"c_version": "2.0.0", "publish_time": "2017-03-23"}}' 
        查询结果: 
        "hits" : [ { 
              "_index" : "bigdata_p", 
              "_type" : "product", 
              "_id" : "2", 
              "_score" : 0.30685282, 
              "_source" : { 
                "name" : "hbase", 
                "author" : "apache", 
                "c_version" : "2.0.0", 
                "publish_time" : "2017-03-23" 
              } 
            } ] 
普通删除,根据主键删除 
curl -XDELETE http://master:9200/bigdata_p/product/3/ 
说明:如果文档存在,es属性found:true,successful:1,_version属性的值+1。 

如果文档不存在,es属性found为false,但是版本值version依然会+1,这个就是内部 

管理的一部分,有点像svn版本号,它保证了我们在多个节点间的不同操作的顺序被正确标记了。 

注意:一个文档被删除之后,不会立即生效,他只是被标记为已删除。ES将会在你之后添加 

更多索引的时候才会在后台进行删除。 
     
批量操作-bulk

Bulk api可以帮助我们同时执行多个请求 
格式: 
       action:[index|create|update|delete] 
       metadata:_index,_type,_id 
       request body:_source(删除操作不需要) 
       {action:{metadata}}\n 
       {request body}\n 
       {action:{metadata}}\n 
       {request body}\n 
      create和index的区别 
如果数据存在,使用create操作失败,会提示文档已经存在,使用index则可以成功执行。 
         
使用文件的方式 
curl -XPOST/PUT http://master:9200/index/type/_bulk --data-binary @path 

比如     
curl -XPOST 'http://master:9200/bank/account/_bulk --data-binary @/home/uplooking/Documents/accounts.json 

查询结果: 
            http://master:9200/bank/_search?pretty 
            { 
              "took" : 10,    ---->默认取出其中前10条记录 
              "timed_out" : false, 
              "_shards" : { 
                "total" : 5, 
                "successful" : 5, 
                "failed" : 0 
              }, 
              "hits" : { 
                "total" : 1000, ----->总共有1000条记录 
                "max_score" : 1.0, 

可以查看一下各个索引库信息 

curl 'http://localhost:9200/_cat/indices?v'

  

简介:

Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式。-X指定http请求的方法,-d指定要传输的数据。

创建索引:

Put创建

curl -XPUThttp://localhost:9200/shb01/student/1-d'{"name":"jack","age":30,"info":"Ilove you"}'

{"_index":"shb01","_type":"student","_id":"1","_version":1,"created":true}Youhave new mail in /var/spool/mail/root

 

执行put后有返回值

_index索引名称

_type类型名

_version版本号

created:true表示是新创建的。

上面的命令每执行一次version就会加1,-XPUT必须制定id。

 

Post创建索引

curl -XPOSThttp://localhost:9200/shb01/student -d'{"name":"tom","age":21,"info":"tom"}'

{"_index":"shb01","_type":"student","_id":"AVadzuNgxskBS1Rg2tdp","_version":1,"created":true}

使用post创建索引数据,-XPOST可以指定id,此时如果存在相同数据则是修改,不指定id的话会随机生成id,且每次执行都会生成新数据。

 

如果需要每次执行都产生新的数据可以使用post命令且不指定id。

如果使用put命令则需要增加create,命令格式如下

curl -XPUT http://localhost:9200/shb01/student/1/_create-d '{"name":"jackk","age":31}'

curl -XPUThttp://localhost:9200/shb01/student/1?op_type=create -d'{"name":"jackk","age":31}'

以上两条命令执行时如果存在id相同的数据则会给出error信息

{"error":"DocumentAlreadyExistsException[[shb01][2][student][1]: document already exists]","status":409}

 

Post与put的区别

Put是等幂操作,即无论执行多少次结果都一样,例如DEL无论删除多少次索引库中的结果都一样,put只要指定了id且数据不变无论执行多少次索引库中的数据都不变,只有version会变化。

Post每次执行都会产生新数据。

查询

1:查询索引库shb01中的类型student

浏览器:http://192.168.79.131:9200/shb01/student/_search?pretty


Curl:curl -XGET http://192.168.79.131:9200/shb01/student/_search?pretty

其显示结果与浏览器一样。

 

2:查询文档1中的数据

http://192.168.79.131:9200/shb01/student/1?pretty

http://192.168.79.131:9200/shb01/student/1?_source&pretty

两者结果一样


http://192.168.79.131:9200/shb01/student/1?_source=name&pretty

可以通过source指定显示那些字段

 

3:查询所有索引库信息

浏览器:http://192.168.79.131:9200/_search?pretty


将索引库shb01和shb02的数据都显示出来。

 

4:根据条件查询

浏览器:http://192.168.79.131:9200/shb01/student/_search?q=name:zs&pretty

查询name为zs的数据




5:查询集群状态


Curl –XGET http://192.168.79.131:9200/_cluster/health?pretty

http://192.168.79.131:9200/_cluster/health?pretty



6:多索引,多类型查询,分页查询,超时


Curl:curl -XGET http://192.168.79.131:9200/shb01,shb02/stu,tea/_search?pretty

curl -XGET http://192.168.79.131:9200/_all/stu,tea/_search?pretty

浏览器去掉curl –XGET即可

分页

curl -XGET http://192.168.79.131:9200/shb01/stu/_search?size=2&from=0

超时

     curl -XPOST http://192.168.79.131:9200/_search?_timeout=100



更新

Es

部分更新

如果文档1的字段很多而我们只需要更新其中的一两个字段则可以通过doc指定需要修改的字段其他字段则不必修改。

crul –XPUT

http:192.168.79.131:9200/shb01/student/1/_update?version=1

 –d ‘{“doc”:{“name”:”updatename”}’

 

全量更新:

    更新文档1中所有字段的内容。

curl -XPUThttp://192.168.79.131:9200/shb01/student/1 -d'{"name":"will","age":100,"info":"newonw"}'

 

更新流程

es会将旧的文档进行标记然后再添加新数据,旧的文档也不能再被访问,在后续添加数据时es会清理已经为删除状态的数据。

删除

删除文档并不会立即生效,只会将其标记为已删除,当后续添加更多索引时才会在后台删除。

curl -XDELETE http://192.168.79.131:9200/shb01/student/AVad05EExskBS1Rg2tdq

根据id删除,删除成功返回found:true,找不到found:false,版本号都会加1。



根据条件删除,删除索引shb01,shb02种类型student,tea中所有name为zs的文档

curl -XDELETEhttp://192.168.79.131:9200/shb01,shb02/student,tea/_query?q=name:zs


删除所有的索引库中名称为tom的文档

curl -XDELETE http://192.168.79.131:9200/_all/_query?q=name:tom

 

批处理

将一批数据加载入内存然后和es交互一次,一次性同时处理多个请求和redis的管道类似。

格式:

Action:index/create/delete/update

Metadata:_index/_type/_id

Create:如果数据存在则报错;index:如果数据存在仍会执行成功。

步骤:

1:在liunx下创建一个文件request1,vi request1

    {"index":{"_index":"shb01","_type":"student","_id":"1"}}

{"name":"st01","age":"10","info":"st01"}

{"create":{"_index":"shb100","_type":"student","_id":"2"}}

{"name":"tea01","age":"10","info":"tea01"}

{"delete":{"_index":"shb01","_type":"student","_id":"AVadzuNgxskBS1Rg2tdp"}

{"update":{"_index":"shb02","_type":"tea","_id":"1"}}

{"doc":{"name":"zszszszs"}}

 

文件中

index表示操作类型

_index指定索引库,_type指定类型,_id指定操作文档

 

 

2:执行批处理命令,关键字_bulk

curl  -XPUThttp://192.168.79.131:9200/_bulk --data-binary @/usr/local/request1

注意:--data-binary@之间有空格隔开,我在实验中没有空格一直提示操作参数不对。

 

3:返回值

{

"took":957,"errors":false,"items":[

{"index":{"_index":"shb01","_type":"student","_id":"1","_version":12,"status":200}},

{"create":{"_index":"shb100","_type":"student","_id":"2","_version":1,"status":201}},

{"delete":{"_index":"shb01","_type":"student","_id":"AVadzuNgxskBS1Rg2tdp","_version":2,"status":200,"found":true}},

{"update":{"_index":"shb02","_type":"tea","_id":"1","_version":2,"status":200}}

]

 

返回信息中errors表示批处理有没有错误,注意version和status,其中shb100为新创建的索引库

下面是我第二次执行request1文件的返回信息,errors为true,表示批处理中有操作执行失败,可以看到create因为库中已有id相同的文档所以报错。但是虽然存在错误操作但其他的操作依然成功执行。这点和redis中的事务操作类似。

{

"took":22,"errors":true,"items":[

{"index":{"_index":"shb01","_type":"student","_id":"1","_version":13,"status":200}},

{"create":{"_index":"shb100","_type":"student","_id":"2","status":409,"error":"DocumentAlreadyExistsException[[shb100][3][student][2]: document already exists]"}},

{"delete":{"_index":"shb01","_type":"student","_id":"AVadzuNgxskBS1Rg2tdp","_version":1,"status":404,"found":false}},

{"update":{"_index":"shb02","_type":"tea","_id":"1","_version":3,"status":200}}

]

}

 

4:在命令中指定索引库和类型

创建一个文件,文件中没有配置索引库和类型

{"index":{"_id":"1"}}

{"name":"st1_1","age":"10","info":"st1_1"}

{"create":{"_id":"200"}}

{"name":"st200","age":"10","info":"st200"}

 

执行如下命令,在命令中指定了索引库和类型

curl  -XPUThttp://192.168.79.131:9200/shb01/student/_bulk --data-binary@/usr/local/request2

 

返回信息

{

"took":24,"errors":false,"items":[

{"index":{"_index":"shb01","_type":"student","_id":"1","_version":17,"status":200}},

{"create":{"_index":"shb01","_type":"student","_id":"200","_version":1,"status":201}}

]

}

 

5:也可以使用-XPOST替换-XPUT



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/7dpcdOqiFO
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/24155