Elastic Search 学习入门之ES的简单操作命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28844767/article/details/84864728

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

-X 指定http的请求方法 有 HEAD  GET  POST PUT DELETE

-d 指定要传输的数据

-H 指定http请求头信息

curl创建索引库:

 curl -XPUT http://<ip>:9200/index_name/

PUT或POST都可以创建(实验:6.2之后不可以)

如:

curl -XPOST 'http://hadoop01:9200/book'

举例:

curl -XPUT 'http://hadoop01:9200/product'

 

  • 创建索引:

    curl -XPOST 'http://hadoop01:9200/product/bigdata/1' -d 

错误: {"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/1' -d '{
	"name": "hadoop",
	"author": "apache",
	"version": "3.1.0"
}'

  • PUT和POST的用户的区别:

    PUT是幂等方法,POST不是。所以PUT用户更新,POST用于新增比较合适。

    PUT和DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都是一样。比如用PUT修改一篇文章,然后再做同样的操作,每次操作后的结果并没有什么不同,DELETE也是一样。

    POST操作不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建了若干的资源。

    还有一点需要注意的是:创建操作可以使用POST,也可以使用PUT,区别在于POST是作用在一个集合资源(/articles)之上的,而PUT操作是作用在一个具体资源之上的(/articles/123),比如: 很多资源使用数据库自增主键作为标识信息,这个时候就需要使用PUT了。而创建的资源的标识信息到底是什么,只能由服务端提供时,这个时候就必须使用POST。

  • ES创建索引库和索引时的注意点

索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号

如果没有明确指定索引数据的ID,那么ES会自动生成一个随机的ID,需要使用POST参数

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/' -d '{
	"name": "hive",
	"author": "Apache",
	"version": "2.1.0"
}'

如果想要确定创建的都是全新的数据

   1. 使用随机ID(POST方式)

   2. 在url后面添加参数

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/3?op_type=create' -d '{
	"name": "hbase"
}'

或者执行:

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/5/_create' -d '{
	"name": "hive"
}'

如果成功创建了新的文档,ES将会返回常见的元数据以及result为created的反馈。如果存在同名文件,ES将会返回version_conflict_engine_exception和返回一个409COnflict的HTTP反馈码。

与之前正常的操作对比:

CURL操作(二):高级查询、更新、删除与批量操作

  • 查询:

curl -XGET 'http://<ip>:9200/index/type/doc'

查询所有:  select * from t;

curl -XGET 'http://hadoop01:9200/product/bigdata/_search'

在任意的查询url中添加pretty参数,ES可以获取更易识别的json结果。

格式化查询结果:

curl -XGET 'http://hadoop01:9200/product/bigdata/_search?pretty'
{
  "took" : 4,
  "timed_out" : false,        ---> 是否超时
  "_shards" : {               ---> 分片个数(一个索引库有几个分区)
    "total" : 5,              ---> 默认分片有5个
    "successful" : 5,         ---> 能够正常提供服务的有5个
    "skipped" : 0,            ---> 跳过的分片
    "failed" : 0              ---> (total - successful) = failed
  },
  "hits" : {                  ---> 查询结果集
    "total" : 3,              ---> 查询到了几条记录
    "max_score" : 1.0,        ---> 记录中最大的得分
    "hits" : [                ---> 具体的结果集数组
      {
        "_index" : "product", ---> 结果所在索引库
        "_type" : "bigdata",  ---> 结果所在索引库中的某个类型type
        "_id" : "2",          ---> 结果索引id
        "_score" : 1.0,       ---> 索引得分
        "_source" : {         ---> 索引具体内容
          "name" : "hbase"
        }
      },
      {
        "_index" : "product",
        "_type" : "bigdata",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "hadoop",
          "author" : "apache",
          "version" : "3.1.0"
        }
      },
      {
        "_index" : "product",
        "_type" : "bigdata",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "name" : "hbase"
        }
      }
    ]
  }
}

查询指定的索引: select * from t where id = xx

curl -XGET 'http://hadoop01:9200/product/bigdata/1?pretty'

查询结果只查询指定字段source:

curl -XGET 'http://hadoop01:9200/product/bigdata/1/_source?pretty'

查询索引里面的包含字段name以h开头的所有文档:

curl -XGET 'http://hadoop01:9200/product/bigdata/_search?q=name:h*&pretty'

 查询索引里面的包含字段name=hadoop的所有文档:

curl -XGET 'http://hadoop01:9200/product/bigdata/_search?q=name:hadoop&pretty'

查询指定字段的source的指定内容:

curl -XGET 'http://hadoop01:9200/product/bigdata/1/?_source=name,author&pretty'

分页查询:

curl -XGET 'http://hadoop01:9200/product/bigdata/_search?pretty&from= 0&size=1'

ES的更新:

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

注意:执行更新操作的时候,ES首先将旧的文档标记为删除状态,然后添加新的文档,旧的文档不会立即消失,但是也无法访问,ES会继续添加更多数据的时候在后台清理已经标记为删除状态的文档。

全局更新(POST):

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/1' -d '{
    "name": "hadoop",
    "author": "Apache",
    "version" : "3.1.0"
}'

全局更新(PUT):  

curl -H "Content-Type: application/json" -XPUT 'http://hadoop01:9200/product/bigdata/1' -d '{
    "name": "hadoop",
    "author": "Apache",
    "version" : "3.1.0"
}'

局部更新:可以添加新字段或者更新已经存在字段(必须使用POST)

要使用uodate,同时要更新的是source中的doc内容。

curl -XPOST 'http://hadoop01:9200/product/bigdata/1/_update' -d '{
    "doc": {
        "author": "Doug Cutting"
    }
}'

ES的删除:

普通删除,根据主键删除:

curl -XDELETE 'http://hadoop01:9200/product/bigdata/3'

说明:如果文档存在,ES属性result: deleted,_version属性的值+1。

如果文档不存在,ES属性result:为not_found,但是版本值依然会+1, 这个就是内部管理的一部分,有点像svn版本号,它保证了我们在多个节点间的不同操作的顺序被正确标记了。

注意:一个文档被删除之后,不会立即生效,它只是被标记为已删除。ES将会在之后添加更多索引的时候才会在后台进行删除。

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则可以成功执行。

数据格式:

{"index":{"_id":"1"}}
{"account_number":1,"balance":325,"email":"[email protected]","city":"Brogan","state":"SH"}
{"index":{"_id":"6"}}
{"account_number":6,"balance":566,"email":"[email protected]","city":"Dante","state":"TT"}
curl -H "Content-Type: application/json" -XPOST 'http://<ip>:9200/bank/account/_bulk?pretty' --data-binary "@data/xxx.json"

例如:

 curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/test/accout/_bulk?pretty' --data-binary "@/home/hadoop/data/elasticsearch/test/test.json"

Bulk请求可以在URL中声明/_index或者/_index/_type

Bulk一次最大处理多少数据量

    Bulk会将要处理的数据载入内存中,所以数据量是有限制的

    最佳的数据量不是一个确定的数值,它取决于你的硬件,文档大小以及复杂性,索引以及搜索的负载

    一般建议是1000~5000个文档,如果你的文档很大,可以适当减少队列,大小建议是5~15MB,默认不能超过100M,可以在ES的配置文件中修改这个值: http.max_content_length: 100MB(这是以前的2.3版本的,在6.5版本中没有找到)

查看各个索引库的信息:

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

    

ES的版本控制:

普通关系型数据库使用的是(悲观并发控制(PCC))

    当我们在读取一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修改这一行数据

ES使用的是(乐观并发控制(OCC))

    ES不会阻止某一数据的访问,然而,如果基础数据在我们读取和写入的间隔中发生了变化,更新就会失败,这时候就由程序来决定如何处理这个冲突。它可以重新读取新数据来进行更新,或者将这一情况直接反馈给用户。

ES如何实现版本控制(使用ES内部版本号)

    首先得到需要修改的文档,获取版本号(_version)

curl -XGET 'http://hadoop01:9200/product/bigdata/1'

再执行更新操作的时候把版本号传过去

覆盖:

curl -H "Content-Type: application/json" -XPUT 'http://hadoop01:9200/product/bigdata/1?version=6' -d '{ 
	"name": "hadoop", 
	"author":"Doug Cutting",
	"version":"6.1.0"
}'

部分更新:

curl -H "Content-Type: application/json" -XPOST 'http://hadoop01:9200/product/bigdata/1/_update?version=7' -d '{ 
	"doc": {"version":"7.1.0"}	
}'

如果传递的版本号和待更新的文档的版本号不一致,则会更新失败

ES如何实现版本控制(使用外部版本号)

如果你的数据库已经存在了版本号,或者是可以代表版本的时间戳。这时就可以在ES的查询url后面添加version_type=external来使用这些号码。

    注意:版本号必须要是大于0小于9223372036854775807(Java中long的最大正值)的整数。

ES在处理外部版本号的时候,它不再检查_version是否与请求中指定的数值是否相等,而是检查当前的_version是否比指定的数值小,如果小,则请求成功。

如:

curl -H "Content-Type: application/json" -XPUT 'http://hadoop01:9200/product/bigdata/2?version=1&version_type=external' -d '{
    "name": "spark"
}'

注意: 此处url前后的引号不能省略,否则执行的时候会报错。

猜你喜欢

转载自blog.csdn.net/qq_28844767/article/details/84864728
今日推荐