關于ElasticSearch增刪改查的方法有很多,使用curl操作命令總結如下,如有需要可以點擊收藏。
1、ElasticSearch新增數據
如果進行一個類似于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"三個字段。其中,-X選項指定HTTP請求的方法,-H選項指定HTTP請求的頭部信息,-d選項指定HTTP請求的數據體。
寫了多條記錄,便于后面進行測試,結果如下:
{"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加以修飾,結果集顯示如下
: {
"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自動生成,可以將"_doc"替換為"_create",這樣在新增數據時,Elasticsearch會在響應中返回文檔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、更新記錄
進行一次類似如下update的操作
update users set age=30 where name='jgt'
可以使用Elasticsearch的Update By Query API來根據條件更新數據。Update By Query API可以對符合特定條件的所有文檔進行更新操作。以下是一個使用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
}
}
}'
更新完成后查看結果如下:
上面的命令使用HTTP POST方法向名為"users"的索引中name為“jgt”的所有文檔的年齡為30。其中:
-X選項指定HTTP請求的方法
-H選項指定HTTP請求的頭部信息
-d選項指定HTTP請求的數據體
"query"字段表示查詢條件:"term"表示匹配字段的值等于給定值,"name"字段表示要匹配的字段,"jgt"表示要匹配的值。
"script"字段表示更新腳本:"source"表示要執行的腳本,"ctx._source.age"表示要更新的字段,"params"表示要傳入的參數,"new_age"表示要更新成的新值。
除了使用Update By Query API,還可以使用Bulk API和Update API對數據進行更新。
Bulk API可以批量處理多個文檔的更新、插入和刪除操作。以下是一個使用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選項指定HTTP請求的方法,-H選項指定HTTP請求的頭部信息,-d選項指定HTTP請求的數據體,"update"表示更新操作,"_id"表示要更新的文檔ID,"_index"表示要更新的索引名,"doc"表示要更新的字段和值。
Update API可以對單個文檔進行更新操作。以下是一個使用curl更新單個文檔的示例:
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選項指定HTTP請求的方法,-H選項指定HTTP請求的頭部信息,-d選項指定HTTP請求的數據體,"_doc"表示要更新的文檔類型,"1"表示要更新的文檔ID,"doc"表示要更新的字段和值。
需要注意的是,Bulk API和Update API都支持批量操作和復雜的更新操作,可以根據具體需求進行使用。同時,更新操作會修改原始數據,因此需要謹慎操作。
3、刪除記錄
進行一次類似如下update的操作
delete from users where name='jgt
可以使用Elasticsearch的Delete By Query API和Delete API來刪除數據。
Delete By Query API可以根據特定條件刪除文檔。以下是一個使用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選項指定HTTP請求的方法,-H選項指定HTTP請求的頭部信息,-d選項指定HTTP請求的數據體,"query"字段表示查詢條件,"term"表示匹配字段的值等于給定值,"name"字段表示要匹配的字段,"att"表示要匹配的值。
Delete API可以刪除單個文檔。以下是一個使用curl刪除單個文檔的示例:
curl -XDELETE "http://127.0.0.1:9200/users/_doc/1"
上面的命令使用HTTP DELETE方法向名為"users"的索引中刪除ID為1的文檔。其中,-X選項指定HTTP請求的方法,"_doc"表示要刪除的文檔類型,"1"表示要刪除的文檔ID。
需要注意的是,刪除操作會永久刪除數據,因此需要謹慎操作。建議在進行刪除操作前進行備份操作,以防止誤操作造成數據丟失。
4、查詢記錄
Elasticsearch提供了豐富的查詢方式,可以根據具體的業務需求進行選擇。以下是幾種常用的查詢方式:
(1)Match Query
根據給定的查詢條件在指定字段中進行匹配。例如,下面的查詢可以匹配"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"
}
}
}'
查詢結果如下:
(2)Term Query
根據給定的查詢條件在指定字段中進行精確匹配。
例如,下面的查詢可以匹配"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"
}
}
}'
查詢結果如下:
(3)Range Query
根據給定的范圍查詢條件在指定字段中進行匹配。
例如,下面的查詢可以匹配"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
}
}
}
}'
查詢結果如下:
(4)Bool Query
根據給定的多個查詢條件進行組合查詢。
例如,下面的查詢可以匹配"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" } }
]
}
}
}'
查詢結果如下:
(5)多條件查詢
在Elasticsearch中,可以使用布爾查詢(Bool Query)來進行多個條件查詢。Bool查詢包含三種類型的子查詢:must、should和must_not。
must查詢:所有的查詢條件都必須匹配才能返回文檔??梢允褂枚鄠€must子句來構建復雜的查詢。
should查詢:至少有一個查詢條件匹配時返回文檔??梢允褂枚鄠€should子句來構建復雜的查詢。
must_not查詢:所有的查詢條件都不能匹配才能返回文檔。
下面是一個示例,演示如何使用Bool查詢來同時匹配多個條件:
{
"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的文檔;
至少匹配一個should子句,其中field3為value3或field4為value4;
不匹配field5為value5的文檔。
可以根據實際情況修改查詢條件。具體示例如下:
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" } }
]
}
}
}'
查詢結果:
(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
}
}
}
}
}
}'
查詢結果如下:
需要注意的是,查詢操作的結果可以通過Elasticsearch的排序、過濾、聚合等方式進行處理,以滿足不同的業務需求。同時,查詢操作也會占用Elasticsearch的系統資源,因此需要謹慎使用,建議根據具體的業務需求選擇合適的查詢方式。
5、小結
ElasticSearch的使用場景和常見的操作命令和方式均很多,后續多總結歸納。