1. 安裝
以Windows版為例。
ElasticSearch官網(wǎng)下載:
https://www.elastic.co/cn/elasticsearch/
解壓后無需安裝,在bin文件夾下找到elasticsearch.bat文件,雙擊運(yùn)行即可。會(huì)彈出cmd窗口
ES使用RESTFUL API操作,可以安裝Postman以方便使用:
https://www.postman.com/
2. 基本操作
2.1 索引庫操作
2.1.1 創(chuàng)建索引庫
ES本地默認(rèn)地址是:
http://127.0.0.1:9200/
首先創(chuàng)建一個(gè)名為shopping的索引庫(index)
[PUT] http://127.0.0.1:9200/shopping
返回"acknowledged": true說明創(chuàng)建成功。注意不支持使用POST,因?yàn)槭莾绲炔僮鳎ㄝ敵鍪俏ㄒ坏模?/p>
2.1.2 查看索引庫
要查看只須方法改為GET即可
[GET] http://127.0.0.1:9200/shopping
2.1.3 刪除索引庫
要?jiǎng)h除只須把方法改為DELETE即可
[DELETE] http://127.0.0.1:9200/shopping
返回"acknowledged": true說明刪除成功。
2.2 文檔操作
先把文檔內(nèi)容以JSON格式寫入Body。注意選擇raw和JSON
2.2.1 不指定ID創(chuàng)建文檔
不指定ID創(chuàng)建文檔,只能用POST方法
[POST] http://127.0.0.1:9200/shopping/_doc/
這樣每次執(zhí)行都會(huì)創(chuàng)建一個(gè)新的文檔,隨機(jī)給定一個(gè)ID。所以是非冪等操作,不能用PUT方法。執(zhí)行一次:
再執(zhí)行一次:
可以看到兩次ID不一樣。全量查詢所有文檔:
[GET] http://127.0.0.1:9200/shopping/_search
返回如下
{
"took": 1331,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "shopping",
"_type": "_doc",
"_id": "Ta_XpnwB9VExessDRbAp",
"_score": 1.0,
"_source": {
"title": "小米手機(jī)",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 4999.00
}
},
{
"_index": "shopping",
"_type": "_doc",
"_id": "Tq_bpnwB9VExessDmbD_",
"_score": 1.0,
"_source": {
"title": "小米手機(jī)",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 4999.00
}
}
]
}
}
能看到上述創(chuàng)建的兩個(gè)文檔。
2.2.2 指定ID創(chuàng)建文檔
在上面命令的基礎(chǔ)上加上ID名即可
[POST] http://127.0.0.1:9200/shopping/_doc/1001
使用PUT也是一樣的效果
[PUT] http://127.0.0.1:9200/shopping/_doc/1001
若再次發(fā)送相同指令,則是更新此文檔,且版本號(hào)累加
另外,也可以用_create來創(chuàng)建新文檔,POST或PUT都可
[POST] http://127.0.0.1:9200/shopping/_create/1002
或
[PUT] http://127.0.0.1:9200/shopping/_create/1002
注意,_create必須指定ID(否則報(bào)錯(cuò)),且不能用于更新文檔(對(duì)相同ID再次執(zhí)行會(huì)報(bào)錯(cuò))
2.2.3 全量更新文檔
在2.2.2已提到,對(duì)已存在的文檔再次執(zhí)行_doc即為全量更新文檔
[POST] http://127.0.0.1:9200/shopping/_doc/1001
或
[PUT] http://127.0.0.1:9200/shopping/_doc/1001
2.2.4 局部更新文檔
比如修改1001的title,那么先要在Body輸入如下JSON內(nèi)容
{
"doc":{
"title":"華為手機(jī)"
}
}
因?yàn)榫植扛聭?yīng)返回不同結(jié)果,所以是非冪等的,所以只能用POST不能用PUT
[POST] http://127.0.0.1:9200/shopping/_update/1001
更新有自檢能力,若重復(fù)執(zhí)行相同JSON則result是noop,表示并沒有更新
2.2.5 刪除文檔
用DELETE和_doc即可刪除指定ID的文檔
[DELETE] http://127.0.0.1:9200/shopping/_doc/1001
2.3 查詢操作
2.3.1 全量查詢
前面有演示過,全量查詢某索引庫使用_search
[GET] http://127.0.0.1:9200/shopping/_search
若在Body中輸入如下內(nèi)容效果一樣
{
"query":{
"match_all":{}
}
}
如果查詢結(jié)果很多,則可以指定返回從第幾個(gè)開始(from)往后幾個(gè)(size)。如返回從第2個(gè)開始往后3個(gè)文檔,則輸入
{
"query":{
"match_all":{}
},
"from":2,
"size":3
}
注意from是從0開始的!
也可以只顯示文檔的部分字段,比如只顯示title和category
{
"query":{
"match_all":{}
},
"_source":["title","category"]
}
還可以排序,如按price降序排列
{
"query":{
"match_all":{}
},
"sort":{
"price":{
"order":"desc"
}
}
}
2.3.2 條件查詢
如查詢category為“小米”的文檔
[GET] http://127.0.0.1:9200/shopping/_search?q=category:小米
上面是通過請(qǐng)求路徑傳遞參數(shù)(?q=category:小米),也可以通過請(qǐng)求體傳遞參數(shù)。在Body中輸入以下JSON內(nèi)容
{
"query":{
"match":{
"category":"小米"
}
}
}
然后發(fā)送_search請(qǐng)求
[GET] http://127.0.0.1:9200/shopping/_search
效果與使用請(qǐng)求路徑傳遞參數(shù)相同
如果需要多條件查詢,則要使用"bool"關(guān)鍵字和關(guān)系關(guān)鍵字(如“且”="must",“或”="should)
例如,查詢category為小米且price為4999.00
{
"query":{
"bool":{
"must":[
{
"match":{
"category":"小米"
}
},
{
"match":{
"price":4999.00
}
}
]
}
}
}
注意must后的中括號(hào),里面包裹了兩個(gè)JSON體。然后發(fā)送_search請(qǐng)求
[GET] http://127.0.0.1:9200/shopping/_search
又如,想查詢category為小米或華為
{
"query":{
"bool":{
"should":[
{
"match":{
"category":"小米"
}
},
{
"match":{
"category":"華為"
}
}
]
}
}
}
然后發(fā)送
[GET] http://127.0.0.1:9200/shopping/_search
如果要查詢范圍,比如price大于4000
{
"query":{
"bool":{
"filter":{
"range":{
"price":{
"gt":4000 //greater than
}
}
}
}
}
}
然后發(fā)送
[GET] http://127.0.0.1:9200/shopping/_search
2.3.3 完全匹配
match是全文檢索,就是說被查詢的關(guān)鍵字會(huì)被分詞后查詢。比如“小米”會(huì)被分為“小”和“米”,只要包含這兩個(gè)字任意一個(gè)的文檔都會(huì)被返回。如果不想這樣就要使用match_phrase來做完全匹配查詢
{
"query":{
"match_phrase":{
"category":"小米"
}
}
}
然后發(fā)送
[GET] http://127.0.0.1:9200/shopping/_search
這樣則必須包含“小米”(順序也不能變,不能是“米小”)的文件才會(huì)被返回
也可以增加highlight字段,在查詢結(jié)果中高亮顯示關(guān)鍵字
{
"query":{
"match":{
"category":"小米"
}
},
"highlight":{
"fields":{
"category":{}
}
}
}
然后發(fā)送
[GET] http://127.0.0.1:9200/shopping/_search
2.3.4 聚合查詢
可以按字段來做統(tǒng)計(jì)。比如統(tǒng)計(jì)不同價(jià)格各有多少
{
"aggs":{ //聚合操作
"price_group":{ //名稱(自定義)
"terms":{ //分組
"field":"price" //分組字段
}
}
},
"size":0 //不顯示原始數(shù)據(jù)
}
然后發(fā)送
[GET] http://127.0.0.1:9200/shopping/_search
說明5999有2個(gè),999有1個(gè),4999有1個(gè)
也可以求平均值
{
"aggs":{ //聚合操作
"price_avg":{ //名稱(自定義)
"avg":{ //平均值
"field":"price" //被處理字段
}
}
},
"size":0 //不顯示原始數(shù)據(jù)
}
同樣發(fā)送
[GET] http://127.0.0.1:9200/shopping/_search
平均值是4499
2.4 映射關(guān)系
對(duì)于某個(gè)字段,是否可以分詞查詢,甚至是否可以被查詢,都是可以設(shè)置的。比如新建一個(gè)名為user的索引
http://127.0.0.1:9200/user
它包含三種字段:name,sex,tel。我們?cè)赽ody中設(shè)置它們的屬性如下
{
"properties":{
"name":{
"type":"text", //text可被分詞查詢
"index":true //true表示可以被查詢
},
"sex":{
"type":"keyword", //keyword不能被分詞查詢,必須完全匹配才會(huì)返回
"index":true //true表示可以被查詢
},
"tel":{
"type":"keyword", //keyword不能被分詞查詢,必須完全匹配才會(huì)返回
"index":false //false表示不能被查詢
}
}
}
發(fā)送指令
[PUT] http://127.0.0.1:9200/user/_mapping
即設(shè)置字段屬性完成。
然后我們可以新建一個(gè)文檔做測(cè)試
{
"name":"高達(dá)",
"sex":"男人",
"tel":1111
}
發(fā)送指令
[POST] http://127.0.0.1:9200/user/_doc/1004
創(chuàng)建完成。然后我們嘗試對(duì)name索引
{
"query":{
"match":{
"name":"高"
}
}
}
發(fā)送指令
http://127.0.0.1:9200/user/_search
能查詢到,因?yàn)閚ame的類型是text,可以被分詞查詢。
再嘗試查詢sex
{
"query":{
"match":{
"sex":"男"
}
}
}
發(fā)送指令
http://127.0.0.1:9200/user/_search
沒有查詢到,因?yàn)閟ex的類型是keyword,不能分詞,必須完整匹配“男人”才能被查詢到。
最后嘗試查詢tel
{
"query":{
"match":{
"tel":1111
}
}
}
發(fā)送指令
http://127.0.0.1:9200/user/_search
查詢失敗,“it is not indexed”,因?yàn)樵O(shè)置mapping時(shí)候?qū)el的index屬性設(shè)為了false
Reference:
【尚硅谷】ElasticSearch教程入門到精通(基于ELK技術(shù)棧elasticsearch 7.8.x版本)_嗶哩嗶哩_bilibili