1.簡單操作
1.1 增加
先插入四條數據
PUT /esstudy/user/1 { "name": "張三", "age": 21 } PUT /esstudy/user/2 { "name": "李四", "age": 22 } PUT /esstudy/user/3 { "name": "王五", "age": 23 } PUT /esstudy/user/4 { "name": "趙六", "age": 24 }
看一下數據:
如果說數據存在那么便是覆蓋(全量覆蓋)
PUT /esstudy/user/1 { "name": "法外狂徒張三", "age": 21, "desc": "法律大牛" }
再執行
GET /esstudy/user/1
PUT /esstudy/user/2 { "name": "李四" }
已經修改了 那么 PUT 可以更新數據但是。麻煩的是 原數據你還要重寫一遍要 這不符合我們規矩。
1.2 更新
使用 POST 命令,在 id 后面跟 _update ,要修改的內容放到 doc 文檔(屬性)中即可。
POST /esstudy/user/3/_update { "doc":{ "name": "王五升級", "age": 23 } }
1.3 刪除
DELETE /xxx
1.4 獲取
GET /xxx
5.查詢
GET esstudy/user/_search?q=name:趙六
通過 _serarch?q=name:狂神說 查詢條件是name屬性有趙六的那些數據。

我們看一下結果 返回並不是 數據本身,是給我們了一個 hits ,還有 _score得分,就是根據算法算出和
查詢條件匹配度高得分就搞。
2.復雜查詢
2.1 查詢所有
GET esstudy/user/_search { "query": { "match_all": {} } }
2.2 構建查詢
再插入一條數據
PUT /esstudy/user/5 { "name": "張三", "age": 21 }
再進行查詢
GET esstudy/user/_search { "query": { "match": { "name": "法外狂徒張三" } } }
通過分數來查看誰更加符合結果
2.3限制屬性
通過 _source 來控制,比如說只需要名字的屬性
GET esstudy/user/_search { "query": { "match": { "name": "張三" } }, "_source": ["name"] }
2.4 排序
根據年齡倒序
GET esstudy/user/_search { "query": { "match_all": {} }, "sort": [ { "age": { "order": "desc" } } ] }
2.5 分頁
GET esstudy/user/_search { "query": { "match_all": {} }, "sort": [ { "age": { "order": "desc" } } ], "from": 0, "size": 2 }
2.6 布爾查詢
1. must
都要符合
例如。查詢名字是張三,年齡是21的
GET esstudy/user/_search { "query": { "bool": { "must": [ { "match": { "name": "張三" } }, { "match": { "age": 21 } } ] } } }
2. should
只要滿足一個即可
GET esstudy/user/_search { "query": { "bool": { "should": [ { "match": { "name": "張三" } }, { "match": { "age": 22 } } ] } } }
3. must_not
查詢不滿足條件的,即過濾操作
GET esstudy/user/_search { "query": { "bool": { "must_not": [ { "match": { "name": "張三" } }, { "match": { "age": 22 } } ] } } }
4. filter
gt 表示大於
gte 表示大於等於
lt 表示小於
lte 表示小於等於
GET esstudy/user/_search { "query": { "bool": { "must": [ { "match": { "name": "張三" } } ], "filter": { "range": { "age": { "gte": 20, "lte": 40 } } } } } }
2.7 term精確查詢
關於分詞:
term 查詢是直接通過倒排索引指定的詞條,也就是精確查找。
term和match的區別:
- match是經過分析(analyer)的,也就是說,文檔是先被分析器處理了,根據不同的分析器,分析出的結果也會不同,在會根據分詞 結果進行匹配。
- term是不經過分詞的,直接去倒排索引查找精確的值。
注意 ⚠ :我們現在 用的es7版本 所以我們用 mappings properties 去給多個字段(fifields)指定類型的時
候,不能給我們的索引制定類型:
創建規則
PUT testdb { "mappings": { "properties": { "name": { "type": "text" }, "desc": { "type": "keyword" } } } }
插入數據:
PUT testdb/_doc/1 { "name": "法外狂徒1號", "desc": "法外狂徒1號decs" } PUT testdb/_doc/2 { "name": "法外狂徒2號", "desc": "法外狂徒2號decs" }
總結:keyword 字段類型不會被分析器分析!
然后使用term查詢
GET testdb/_search { "query": { "term": { "desc": "法外狂徒2號decs" } } }
可以看到結果只有一個
如果只查詢法外狂徒那么一個都沒有
GET testdb/_search { "query": { "term": { "desc": "法外狂徒" } } }
精確查詢多個值:
GET esstudy/user/_search { "query": { "bool": { "should": [ { "term": { "age": "22" } }, { "term": { "age": 21 } } ] } } }
2.8 高亮顯示
GET esstudy/user/_search
{
"query": {
"match": {
"name": "張三"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
可以看到加上了em標簽,當然我們也可以自定義。
GET esstudy/user/_search { "query": { "match": { "name": "張三" } }, "highlight": { "pre_tags": "<p class='key' style='color:red'>", "post_tags": "</p>", "fields": { "name": {} } } }