03_ES安裝和基本使用

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容