一、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
bulk
是es
提供的一种批量增删改
的操作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"
}
}
]
}
}
评论 (0)