ES版本:6.8
本篇文章主要介紹在ES中如何進(jìn)行數(shù)據(jù)的增刪查改
新增數(shù)據(jù)
ES可以直接新增數(shù)據(jù)猾蒂,沒有索引會自動創(chuàng)建索引唾那,但是不推薦這種方式溪掀,因?yàn)闀鶕?jù)默認(rèn)值創(chuàng)建分片和副本數(shù)枷踏。
// test1索引名凿可,_doc是類型繁仁,1表示主鍵值(也可以省略涉馅,ES會默認(rèn)生成一個)
POST test1/_doc/1
{
"uid" : "1234",
"phone" : "12345678909",
"message" : "qq",
"msgcode" : "1",
"sendtime" : "2019-03-14 01:57:04"
}
創(chuàng)建索引
ES常用基本類型有text、keyword黄虱、byte稚矿、short、integer捻浦、long晤揣、float、double朱灿、boolean昧识、date。其中text簡單理解為需要分詞盗扒,keyword不會分詞可以進(jìn)行排序或聚合
如下跪楞,指定settings和mappings來創(chuàng)建索引
PUT test1
{
"settings": {
//分片數(shù)
"number_of_shards": 10,
// 副本數(shù)
"number_of_replicas": 1,
// 刷新頻率
"refresh_interval": "1s"
},
"mappings": {
"_doc": {
"properties": {
"uid": {
"type": "long"
},
"phone": {
"type": "long"
},
"message": {
"type": "keyword"
},
"msgcode": {
"type": "long"
},
"sendtime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
}
查詢所有索引信息
GET _cat/indices
查詢數(shù)據(jù)
// 查詢索引test1,返回settings,mapping等
GET test1
// 查詢test1索引下的settings侣灶,里面是索引相關(guān)信息甸祭,比如分區(qū)數(shù)副本數(shù)等
GET test1/_settings
// 查詢test1索引下的mapping,里面是字段的一些信息
GET test1/_mapping
修改數(shù)據(jù)
- ES的修改和新增其實(shí)是一樣的褥影,沒有數(shù)據(jù)就創(chuàng)建池户。
// 如果ES中沒有此數(shù)據(jù),則創(chuàng)建凡怎;如果存在校焦,則覆蓋
POST test1/_doc/1
{
"uid" : "1234",
"phone" : "12345678909",
"message" : "qq",
"msgcode" : "1",
"sendtime" : "2019-03-14 01:57:04"
}
- 根據(jù)條件修改
POST test1/_update_by_query
{
"query": {
// term 精確匹配,下面會有說明
"term": {
"phone": "12345678909"
}
} ,
"script": {
// 將message字段內(nèi)容修改為xuwujing
"source": "ctx._source['message'] = 'xuwujing'"
}
}
刪除數(shù)據(jù)
- 根據(jù)主鍵刪除
DELETE test1/1
- 根據(jù)條件刪除
POST test/_delete_by_query
{
"query":{
"term":{
"phone":"12345678909"
}
}
}
- 刪除字段
POST test1/_doc/_update_by_query
{
"script": {
"lang": "painless",
"source": "ctx._source.remove(\"msgcode\")"
}
}
查詢
查詢所有
// match_all查詢集群所有索引庫信息栅贴,包括隱藏的索引庫
GET _search
{
"query": {
"match_all": {}
}
}
查詢某個索引下的數(shù)據(jù)斟湃,語法為:GET 索引庫名稱/索引庫類型/_search
, 其中索引庫類型也可以不寫,如下
// 查詢test1所有數(shù)據(jù)
GET test1/_doc/_search
// 查詢test2下主鍵為2的數(shù)據(jù)
GET test1/_doc/2
term查詢
term用于精確匹配檐薯,比如數(shù)字凝赛,日期,布爾值等
例如:
// 查詢phone為12345678909的所有記錄
GET test1/_doc/_search
{
"query": {
"term": {
"phone": "12345678909"
}
}
}
// terms查詢坛缕,類似SQL中的in
GET test1/_doc/_search
{
"query": {
"terms": {
"uid": [
1234,
12345,
123456
]
}
}
}
range查詢
范圍查詢墓猎,gt大于,lt小于赚楚,gte大于等于毙沾,lte小于等于
// 查詢uid大于1234,小于等于12345的記錄
GET test1/_doc/_search
{
"query": {
"range": {
"uid": {
"gt": 1234,
"lte": 12345
}
}
}
}
exists查詢
// 查詢存在msgcode字段的記錄
GET test1/_doc/_search
{
"query": {
"exists": {
"field":"msgcode"
}
}
}
bool查詢
可以用來合并多個過濾條件
- must:多個查詢條件的完全匹配,相當(dāng)于 and宠页。
- must_not:多個查詢條件的相反匹配左胞,相當(dāng)于 not寇仓。
- should:至少有一個查詢條件匹配, 相當(dāng)于 or。
GET /test1/_search
{
"query": {
"bool": {
"must": {
"term": {
"phone": "12345678909"
}
},
"must_not": {
"term": {
"uid": 12345
}
},
"should": [
{
"term": {
"uid": 1234
}
},
{
"term": {
"uid": 123456
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
}
}
wildcard查詢
wildcard類似于SQL的like查詢,需要帶上**
GET /test1/_search
{
"query": {
"wildcard": {
"message":"*wu*"
}
}
}
regexp查詢
regexp即正則查詢
GET /test1/_search
{
"query": {
"regexp": {
"message":"xu[0-9]"
}
}
}
全文檢索
ES根據(jù)查詢條件計(jì)算每個匹配的記錄的得分烤宙,即_scope字段遍烦,默認(rèn)根據(jù)得分排序返回
match
- match是標(biāo)準(zhǔn)的全文檢索
- 在匹配之前會先對查詢關(guān)鍵字進(jìn)行分詞
- 可以指定分詞器來覆蓋mapping中設(shè)置的搜索分詞器
如下例子,會根據(jù)ik_smart分詞器將超級羽絨服
關(guān)鍵字分詞為超級躺枕、羽絨服然后再去es中查詢與這兩個分詞相匹配的文檔服猪,依據(jù)相關(guān)度即分值得到以下結(jié)果
GET idx_pro/_search
{
"query": {
"match": {
"name": {
"query": "超級羽絨服",
"analyzer": "ik_smart"
}
}
}
}
match_phrase
match是根據(jù)分詞后的結(jié)果進(jìn)行匹配,match_phrase來直接進(jìn)行短語匹配.如下例子拐云,會查詢address字段中包含mill lane短語的記錄
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
如果緩存match罢猪,則只有address包含mill或lane,這些記錄都會返回
GET /bank/_search
{
"query": { "match": { "address": "mill lane" } }
}