ElasticSearch操作命令学习笔记

jupiter
2024-12-13 / 0 评论 / 4 阅读 / 正在检测是否收录...

一、ES概念

1.ES vs MySQL

下图是ES和MySQL中一些概念的对应,其中type的概念已经被弱化,在ES 7.X之后被删除。

2. index(索引)

一个索引就是一个拥有几分相似特征的文档的集合。一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除(CRUD)的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。相当于MySQL中的数据库。

3. type(类型)

一个索引中可以定义一种或多种类型。一个类型是索引的一个逻辑上的分类/分区,其语义完全由你来定。相当于MySQL中的表。

4. document(文档)

一个文档是一个可被索引的基础信息单元,也就是一条数据。相当于MySQL中的一条记录。

5. field(字段)

相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。相当于MySQL中表的字段。

6. mapping(映射)

mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等。相当于MySQL中的建表过程中设置默认值、主外键、索引等。

7. cluster(集群)

一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。

8. node(节点)

一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。

9. shard(分片)

Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。它允许水平分割/扩展你的内容容量,或者在多个节点上上进行分布式的、并行的操作,进而提高性能/吞吐量。

分片很重要,主要有两方面的原因:

  • 允许你水平分割扩展你的内容容量
  • 允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量

10. replicas(副本)

Elasticsearch允许你创建分片的一份或多份备份,这些备份叫做复制分片,或者直接叫副本。

复制分片之所以重要,有两个主要原因:

  • 在分片/节点失败的情况下,提供了高可用性
  • 扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行

11. allocation(分配)

将分片分配给某个节点的过程,包括分配主分片或者副本。如果是副本,还包含从主分片复制数据的过程。这个过程是由master节点完成的。

二、操作类型和操作对象

2.1 GET/PUT/POST/DELETE

ES中主要有GET/PUT/POST/DELETE这四种操作,分别表示查询、更新或创建、创建、删除操作。其中PUT和POST的区别是:PUT在插入新数据的时候需要指定\_id,而POST则不需要,这个\_id是ES中文档的唯一标识。换种说法,PUT是幂等的,即多次执行的结果相同,而POST不是幂等的,多次执行会插入多条数据。

2.2 \_mapping/\_settings/\_search/\_count/\_doc

\_mapping:映射

\_settings:索引设置

\_search:查询记录值

\_count:查询记录数

\_doc:查询文档信息

三、常用命令-基于HTTP

3.1 索引操作

3.1.1 查看ES中所有的索引

curl -X GET localhost:9200/_cat/indices?v
health status index                                                              uuid                   pri rep docs.count docs.deleted store.size pri.store.size dataset.size
green  open   .internal.alerts-transform.health.alerts-default-000001            0jJ5YtamSbu_RMpyZsADWQ   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.logs.alerts-default-000001          8l82KL0aTYSyOixYMIFHUA   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.uptime.alerts-default-000001        mjN3TqVBT26Ucs4e_2T3Vw   1   0          0            0       249b           249b         249b
yellow open   my-index                                                           SfBZ1owlSlKgHmJbrnE01w   1   1          1            0      7.4kb          7.4kb        7.4kb
green  open   .internal.alerts-ml.anomaly-detection.alerts-default-000001        3JuCHDUcRQ-96azpOnCudA   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.slo.alerts-default-000001           pUDfYaqwRUWvPulwpgYEDA   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-default.alerts-default-000001                     0qH28FBgSHmQJV_NcHTW2Q   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.apm.alerts-default-000001           M-sFTRA0Sg2wyu_ap01LEQ   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.metrics.alerts-default-000001       5jpzq40eSH2Ff11UG9qdqg   1   0          0            0       249b           249b         249b
green  open   .kibana-observability-ai-assistant-conversations-000001            cOnxLTJkTd2KDD1VH4jtxg   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-ml.anomaly-detection-health.alerts-default-000001 2muiWcoHSr64J67DukLKRA   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-observability.threshold.alerts-default-000001     yagwO-YsRauui9P269MUYg   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-security.alerts-default-000001                    q1Hy67EOR6mnn60BDbt0DA   1   0          0            0       249b           249b         249b
green  open   .kibana-observability-ai-assistant-kb-000001                       2ZQnm6pkQMOWhBxUZLtIYg   1   0          0            0       249b           249b         249b
green  open   .internal.alerts-stack.alerts-default-000001                       yvP_JmetS4iQAjSy8h5dNg   1   0          0            0       249b           249b         249b

3.1.2 创建索引

  • 简单创建
curl -X PUT localhost:9200/test
{"acknowledged":true,"shards_acknowledged":true,"index":"test"}
  • 创建索引时指定映射
curl -X PUT "http://localhost:9200/my_index" -H 'Content-type:application/json' -d '
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "price": {
        "type": "double"
      },
      "published_date": {
        "type": "date"
      }
    }
  }
}
'
{"acknowledged":true,"shards_acknowledged":true,"index":"my_index"}

3.1.3 创建(查看)索引mapping(字段)

为索引创建mapping
curl -X PUT "http://localhost:9200/test/_mapping" -H 'Content-type:application/json' -d '
{
  "properties": {
   "title": {
        "type": "text"
      }
  }
}
'
查看索引mapping
curl -X GET "http://localhost:9200/test/_mapping"
{"test":{"mappings":{"properties":{"title":{"type":"text"}}}}}
修改索引mapping
  • 如果索引已经创建,也可以单独更新映射。但是需要注意的是,Elasticsearch不允许对已存在字段的类型进行修改(除了某些特殊情况)。
curl -X PUT "http://localhost:9200/my_index/_mapping" -H 'Content-type:application/json' -d '
{
  "properties": {
    "new_field": {
      "type": "keyword"
    }
  }
}
'
{"acknowledged":true}
  • 这里我们向已经存在的my_index索引中添加了一个新的字段new_field,类型为keyword

3.1.4 删除索引

删除单个索引
curl -X DELETE localhost:9200/test 
{"acknowledged":true}
批量删除索引
# 删除多个索引,中间用逗号隔开
curl -XDELETE http://localhost:9200/索引名称1,索引名称2

# 模糊匹配删除 
$ curl -XDELETE -u elastic:changeme http://localhost:9200/索引名前缀*

# 使用通配符,删除所有索引 二选一都可以
$ curl -XDELETE http://localhost:9200/_all
$ curl -XDELETE http://localhost:9200/*
#  _all ,* 通配所有的索引,通常不建议使用通配符,误删了后果就很严重了,所有的index都被删除了,禁止通配符为了安全起见,可以在elasticsearch.yml配置文件中设置禁用_all和*通配符
`action.destructive_requires_name = true`这样就不能使用_all和*了!

3.1.5 查看指定索引信息

?pertty 表示让数据格式化,更好的展示
curl -X GET localhost:9200/test?pretty
{
  "test" : {
    "aliases" : ,
    "mappings" : {
      "properties" : {
        "title" : {
          "type" : "text"
        }
      }
    },
    "settings" : {
      "index" : {
        "routing" : {
          "allocation" : {
            "include" : {
              "_tier_preference" : "data_content"
            }
          }
        },
        "number_of_shards" : "1",
        "provided_name" : "test",
        "creation_date" : "1734017722530",
        "number_of_replicas" : "1",
        "uuid" : "tXo4Z_edQ1eRwkuzmWY33A",
        "version" : {
          "created" : "8505000"
        }
      }
    }
  }
}

3.2 文档操作

3.2.1 新增文档

新增文档,并指定id字段(replace)
 curl -X PUT localhost:9200/test_index/_doc/1 -H 'Content-type:application/json' -d '{"name":"Jupiter","age":18}'
{"_index":"test_index","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}[
新增文档,并指定ID字段(insert)

该模式下,若指定id对应的文档存在,则直接返回报错

 curl -X PUT localhost:9200/test_index/_create/1 -H 'Content-type:application/json' -d '{"name":"Jupiter","age":18}'
{"error":{"root_cause":[{"type":"version_conflict_engine_exception","reason":"[1]: version conflict, document already exists (current version [1])","index_uuid":"uxEK6rUiQIKRz4B48xvitQ","shard":"0","index":"test_index"}],"type":"version_conflict_engine_exception","reason":"[1]: version conflict, document already exists (current version [1])","index_uuid":"uxEK6rUiQIKRz4B48xvitQ","shard":"0","index":"test_index"},"status":409}[
新增文档,不指定ID字段,系统自动生产ID
 curl -X POST localhost:9200/test_index/_doc -H 'Content-type:application/json' -d '{"name":"aaa","age":13}'
{"_index":"test_index","_id":"m_6du5MBv8SIaajvQ-b4","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}[

3.2.2 更新文档

更新指定ID文档,存在则更新,不存在则新增(也是新增文档的一种)
 curl -X PUT localhost:9200/test_index/_doc/2 -H 'Content-type:application/json' -d '{"name":"bbb","age":18}'
#  curl -X GET localhost:9200/test_index/_doc/2?pretty
{
  "_index" : "test_index",
  "_id" : "2",
  "_version" : 1,
  "_seq_no" : 2,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "bbb",
    "age" : 18
  }
更新指定ID文档,更新文档必须存在,否则报错
 curl -X PUT localhost:9200/test_index/_doc/2 -H 'Content-type:application/json' -d '{"name":"ccc","age":18}'
# curl -X GET localhost:9200/test_index/_doc/2?pretty
{
  "_index" : "test_index",
  "_id" : "2",
  "_version" : 2,
  "_seq_no" : 3,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "ccc",
    "age" : 18
  }
}

3.2.3 删除文档

删除指定ID文档
curl -X DELETE localhost:9200/test_index/_doc/2
# curl -X GET localhost:9200/test_index/_doc/2?pretty
{
  "_index" : "test_index",
  "_id" : "2",
  "found" : false
}
删除满足条件查询文档
 curl -X POST localhost:9200/test_index/_delete_by_query -H 'Content-type:application/json' -d '{
  "query":{
    "match":{
      "name":"ccc"
    }
  }
}'
{"took":9,"timed_out":false,"total":1,"deleted":1,"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":[]}

3.2.4 查询文档

查询指定ID文档
curl -X GET localhost:9200/test_index/_doc/1
{"_index":"test_index","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"name":"Jupiter","age":18}}
search api查询满足条件的文档
curl -X GET localhost:9200/test_index/_search -H 'Content-type:application/json' -d '{
  "query": {
    "match": {
      "age": "18"
    }
  }
}'
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":2,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"test_index","_id":"1","_score":1.0,"_source":{"name":"Jupiter","age":18}},{"_index":"test_index","_id":"2","_score":1.0,"_source":{"name":"bbb","age":18}}]}}[
查询所有文档
curl -X GET localhost:9200/users/_search?pretty -H 'Content-type:application/json' -d '{
  "query": {
    "match_all": {}
  }
}'

3.2.5 bulk api

bulkes提供的一种批量增删改的操作API。

bulk的操作类型:

  • create 如果文档不存在就创建,但如果文档存在就返回错误
  • index 如果文档不存在就创建,如果文档存在就更新
  • update 更新一个文档,如果文档不存在就返回错误
  • delete 删除一个文档,如果要删除的文档id不存在,就返回错误

bulk的操作,某一个操作失败,是不会影响其他文档的操作的,它会在返回结果中告诉你失败的详细的原因。

curl -X POST  localhost:9200/_bulk  -H 'Content-type:application/json' -d '
{"index":{"_index":"users","_id":"1"}}
{"name":"aa"}
{"create":{"_index":"users","_id":"2"}}
{"name":"bb"}
{"delete":{"_index":"users","_id":"2"}}
{"update":{"_index":"users","_id":"1"}}
{"doc":{"auto_inc":"11"}}
'
curl -X GET localhost:9200/users/_search?pretty -H 'Content-type:application/json' -d '{
  "query": {
    "match_all": {}
  }
}'
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "users",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "name" : "bb"
        }
      },
      {
        "_index" : "users",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "aa",
          "auto_inc" : "11"
        }
      }
    ]
  }
}

参考资料

  1. 【学习笔记】ElasticSearch(ES)基本概念和语句学习笔记_es 建表-CSDN博客
  2. Elasticsearch(ES)常用命令整理_elasticsearch常用命令-CSDN博客
  3. ES命令行操作 - 吕振江 - 博客园
  4. 如何在 Elasticsearch 中创建索引和映射?_es创建索引命令-CSDN博客
  5. Elasticsearch(037):es中批量操作之bulk_es bulk-CSDN博客
  6. elasticsearch bulk批量增删改(超详细)-CSDN博客
0

评论 (0)

打卡
取消