
關(guān)于ElasticSearch增刪改查的方法有很多,使用curl操作命令總結(jié)如下,如有需要可以點(diǎn)擊收藏。
1、ElasticSearch新增數(shù)據(jù)
如果進(jìn)行一個(gè)類似于SQL的 insert的操作
insert into users(name,age,email) values('ctt',18,'ctt@abc.com')
具體示例如下:
curl -XPOST "http://127.0.0.1:9200/users/_doc" -H "Content-Type: application/json" -d '
{
"name": "ctt",
"age": 18,
"email": "ctt@abc.com"
}'

上面的命令使用HTTP POST方法向名為"users"的索引中添加一條文檔,文檔包含"name"、"age"和"email"三個(gè)字段。其中,-X選項(xiàng)指定HTTP請求的方法,-H選項(xiàng)指定HTTP請求的頭部信息,-d選項(xiàng)指定HTTP請求的數(shù)據(jù)體。
寫了多條記錄,便于后面進(jìn)行測試,結(jié)果如下:
{"took":1,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":5,"max_score":1.0,"hits":[{"_index":"users","_type":"_doc","_id":"Uxz2jYYBNjbWHoXGCfXa","_score":1.0,"_source":
{
"name": "jgt",
"age": 29,
"email": "jgt@abc.com"
}},{"_index":"users","_type":"_doc","_id":"UBz0jYYBNjbWHoXGufWJ","_score":1.0,"_source":
{
"name": "ttc",
"age": 20,
"email": "ttc@abc.com"
}},{"_index":"users","_type":"_doc","_id":"URz1jYYBNjbWHoXGOvU0","_score":1.0,"_source":
{
"name": "tt",
"age": 25,
"email": "tt@abc.com"
}},{"_index":"users","_type":"_doc","_id":"Uhz1jYYBNjbWHoXGhPWI","_score":1.0,"_source":
{
"name": "att",
"age": 27,
"email": "att@abc.com"
}},{"_index":"users","_type":"_doc","_id":"TxzvjYYBNjbWHoXG-fUx","_score":1.0,"_source":
{
"name": "ctt",
"age": 18,
"email": "ctt@abc.com"
}}]}}

可以用pretty加以修飾,結(jié)果集顯示如下
: {
"name" : "ttc",
"age" : 20,
"email" : "ttc@abc.com"
}
},
{
"_index" : "users",
"_type" : "_doc",
"_id" : "URz1jYYBNjbWHoXGOvU0",
"_score" : 1.0,
"_source" : {
"name" : "tt",
"age" : 25,
"email" : "tt@abc.com"
}
},
{
"_index" : "users",
"_type" : "_doc",
"_id" : "Uhz1jYYBNjbWHoXGhPWI",
"_score" : 1.0,
"_source" : {
"name" : "att",
"age" : 27,
"email" : "att@abc.com"
}
},
{
"_index" : "users",
"_type" : "_doc",
"_id" : "TxzvjYYBNjbWHoXG-fUx",
"_score" : 1.0,
"_source" : {
"name" : "ctt",
"age" : 18,
"email" : "ctt@abc.com"
}
}
]
}
}
如果新增的文檔ID由Elasticsearch自動(dòng)生成,可以將"_doc"替換為"_create",這樣在新增數(shù)據(jù)時(shí),Elasticsearch會在響應(yīng)中返回文檔ID,示例如下:
curl -XPOST "http://127.0.0.1:9200/users/_create" -H "Content-Type: application/json" -d '
{
"name": "ctty",
"age": 30,
"email": "ctty@abc.com"
}'
2、更新記錄
進(jìn)行一次類似如下update的操作
update users set age=30 where name='jgt'
可以使用Elasticsearch的Update By Query API來根據(jù)條件更新數(shù)據(jù)。Update By Query API可以對符合特定條件的所有文檔進(jìn)行更新操作。以下是一個(gè)使用curl更新滿足條件的文檔的示例:
curl -XPOST "http://127.0.0.1:9200/users/_update_by_query" -H "Content-Type: application/json" -d '
{
"query": {
"term": {
"name": "jgt"
}
},
"script": {
"source": "ctx._source.age = params.new_age",
"params": {
"new_age": 30
}
}
}'
更新完成后查看結(jié)果如下:

上面的命令使用HTTP POST方法向名為"users"的索引中name為“jgt”的所有文檔的年齡為30。其中:
-X選項(xiàng)指定HTTP請求的方法
-H選項(xiàng)指定HTTP請求的頭部信息
-d選項(xiàng)指定HTTP請求的數(shù)據(jù)體
"query"字段表示查詢條件:"term"表示匹配字段的值等于給定值,"name"字段表示要匹配的字段,"jgt"表示要匹配的值。
"script"字段表示更新腳本:"source"表示要執(zhí)行的腳本,"ctx._source.age"表示要更新的字段,"params"表示要傳入的參數(shù),"new_age"表示要更新成的新值。
除了使用Update By Query API,還可以使用Bulk API和Update API對數(shù)據(jù)進(jìn)行更新。
Bulk API可以批量處理多個(gè)文檔的更新、插入和刪除操作。以下是一個(gè)使用curl批量更新文檔的示例:
curl -XPOST "http://127.0.0.1:9200/users/_bulk" -H "Content-Type: application/json" -d '
{ "update": {"_id": "1", "_index": "users"} }
{ "doc": {"age": 16} }
{ "update": {"_id": "2", "_index": "users"} }
{ "doc": {"age": 16} }
'
上面的命令使用HTTP POST方法向名為"users"的索引中批量更新文檔的age。其中:-X選項(xiàng)指定HTTP請求的方法,-H選項(xiàng)指定HTTP請求的頭部信息,-d選項(xiàng)指定HTTP請求的數(shù)據(jù)體,"update"表示更新操作,"_id"表示要更新的文檔ID,"_index"表示要更新的索引名,"doc"表示要更新的字段和值。
Update API可以對單個(gè)文檔進(jìn)行更新操作。以下是一個(gè)使用curl更新單個(gè)文檔的示例:
curl -XPOST "http://127.0.0.1:9200/users/_doc/1/_update" -H "Content-Type: application/json" -d '
{
"doc": {
"age": 16
}
}'
上面的命令使用HTTP POST方法向名為"users"的索引中更新ID為1的文檔的age為16。其中,-X選項(xiàng)指定HTTP請求的方法,-H選項(xiàng)指定HTTP請求的頭部信息,-d選項(xiàng)指定HTTP請求的數(shù)據(jù)體,"_doc"表示要更新的文檔類型,"1"表示要更新的文檔ID,"doc"表示要更新的字段和值。
需要注意的是,Bulk API和Update API都支持批量操作和復(fù)雜的更新操作,可以根據(jù)具體需求進(jìn)行使用。同時(shí),更新操作會修改原始數(shù)據(jù),因此需要謹(jǐn)慎操作。
3、刪除記錄
進(jìn)行一次類似如下update的操作
delete from users where name='jgt
可以使用Elasticsearch的Delete By Query API和Delete API來刪除數(shù)據(jù)。
Delete By Query API可以根據(jù)特定條件刪除文檔。以下是一個(gè)使用curl刪除滿足條件的文檔的示例:
curl -XPOST "http://127.0.01:9200/users/_delete_by_query" -H "Content-Type: application/json" -d '
{
"query": {
"term": {
"name": "att"
}
}
}'
上面的命令使用HTTP POST方法向名為"users"的索引中刪除"name"為"att"的所有文檔。其中,-X選項(xiàng)指定HTTP請求的方法,-H選項(xiàng)指定HTTP請求的頭部信息,-d選項(xiàng)指定HTTP請求的數(shù)據(jù)體,"query"字段表示查詢條件,"term"表示匹配字段的值等于給定值,"name"字段表示要匹配的字段,"att"表示要匹配的值。
Delete API可以刪除單個(gè)文檔。以下是一個(gè)使用curl刪除單個(gè)文檔的示例:
curl -XDELETE "http://127.0.0.1:9200/users/_doc/1"
上面的命令使用HTTP DELETE方法向名為"users"的索引中刪除ID為1的文檔。其中,-X選項(xiàng)指定HTTP請求的方法,"_doc"表示要?jiǎng)h除的文檔類型,"1"表示要?jiǎng)h除的文檔ID。
需要注意的是,刪除操作會永久刪除數(shù)據(jù),因此需要謹(jǐn)慎操作。建議在進(jìn)行刪除操作前進(jìn)行備份操作,以防止誤操作造成數(shù)據(jù)丟失。
4、查詢記錄
Elasticsearch提供了豐富的查詢方式,可以根據(jù)具體的業(yè)務(wù)需求進(jìn)行選擇。以下是幾種常用的查詢方式:
(1)Match Query
根據(jù)給定的查詢條件在指定字段中進(jìn)行匹配。例如,下面的查詢可以匹配"my_field"字段中包含"my_value"的文檔:
{ "query": { "match": { "my_field": "my_value" } } }
具體示例如下:
curl -XGET "http://127.0.0.1:9200/users/_search?pretty" -H "Content-Type: application/json" -d '
{
"query": {
"match": {
"name": "tt"
}
}
}'
查詢結(jié)果如下:

(2)Term Query
根據(jù)給定的查詢條件在指定字段中進(jìn)行精確匹配。
例如,下面的查詢可以匹配"my_field"字段中值為"my_value"的文檔:
{ "query": { "term": { "my_field": "my_value" } } }
具體示例如下:
curl -XGET "http://127.0.0.1:9200/users/_search?pretty" -H "Content-Type: application/json" -d '
{
"query": {
"term": {
"name": "ctt"
}
}
}'
查詢結(jié)果如下:

(3)Range Query
根據(jù)給定的范圍查詢條件在指定字段中進(jìn)行匹配。
例如,下面的查詢可以匹配"my_field"字段中值在10到20之間的文檔:
{ "query": { "range": { "my_field": { "gte": 10, "lte": 20 } } } }
具體示例如下:
curl -XGET "http://127.0.0.1:9200/users/_search?pretty" -H "Content-Type: application/json" -d '
{
"query": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
}
}'
查詢結(jié)果如下:

(4)Bool Query
根據(jù)給定的多個(gè)查詢條件進(jìn)行組合查詢。
例如,下面的查詢可以匹配"my_field1"字段中值包含"my_value1"并且"my_field2"字段中值包含"my_value2"的文檔:
{ "query":
{ "bool":
{ "must": [ { "match": { "my_field1": "my_value1" } },
{ "match": { "my_field2": "my_value2" } }
]
} } }
具體示例如下:
curl -XGET "http://127.0.0.1:9200/users/_search?pretty" -H "Content-Type: application/json" -d '
{
"query": {
"bool": {
"must": [
{ "match": { "name": "ctt" } },
{ "match": { "age": "18" } }
]
}
}
}'
查詢結(jié)果如下:

(5)多條件查詢
在Elasticsearch中,可以使用布爾查詢(Bool Query)來進(jìn)行多個(gè)條件查詢。Bool查詢包含三種類型的子查詢:must、should和must_not。
must查詢:所有的查詢條件都必須匹配才能返回文檔??梢允褂枚鄠€(gè)must子句來構(gòu)建復(fù)雜的查詢。
should查詢:至少有一個(gè)查詢條件匹配時(shí)返回文檔??梢允褂枚鄠€(gè)should子句來構(gòu)建復(fù)雜的查詢。
must_not查詢:所有的查詢條件都不能匹配才能返回文檔。
下面是一個(gè)示例,演示如何使用Bool查詢來同時(shí)匹配多個(gè)條件:
{
"query": {
"bool": {
"must": [
{ "match": { "field1": "value1" } },
{ "match": { "field2": "value2" } }
],
"should": [
{ "match": { "field3": "value3" } },
{ "match": { "field4": "value4" } }
],
"must_not": [
{ "match": { "field5": "value5" } }
]
}
}
}
在上面的示例中,查詢條件包括:
必須匹配field1為value1的文檔;
必須匹配field2為value2的文檔;
至少匹配一個(gè)should子句,其中field3為value3或field4為value4;
不匹配field5為value5的文檔。
可以根據(jù)實(shí)際情況修改查詢條件。具體示例如下:
curl -XGET "http://127.0.0.1:9200/users/_search?pretty" -H "Content-Type: application/json" -d '
{
"query": {
"bool": {
"must": [
{ "match": { "name": "ctt" } },
{ "match": { "age": "18" } }
],
"should": [
{ "match": { "name": "tt" } },
{ "match": { "age": "18" } }
],
"must_not": [
{ "match": { "name": "jgt" } }
]
}
}
}'
查詢結(jié)果:

(6)組合查詢
類似于如下SQL的組合條件查詢
select * from users where (name like '%ctt%' or name like '%tt%') and age >=10 and age<=2
具體示例如下:
curl -XGET "http://127.0.0.1:9200/users/_search?pretty" -H "Content-Type: application/json" -d '
{
"query": {
"bool": {
"should": [
{ "match": { "name": "ctt" } },
{ "match": { "name": "tt" } }
],
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
}
}
}
}'
查詢結(jié)果如下:

需要注意的是,查詢操作的結(jié)果可以通過Elasticsearch的排序、過濾、聚合等方式進(jìn)行處理,以滿足不同的業(yè)務(wù)需求。同時(shí),查詢操作也會占用Elasticsearch的系統(tǒng)資源,因此需要謹(jǐn)慎使用,建議根據(jù)具體的業(yè)務(wù)需求選擇合適的查詢方式。
5、小結(jié)
ElasticSearch的使用場景和常見的操作命令和方式均很多,后續(xù)多總結(jié)歸納。