準備工作
0、什麼是ElasticSearch?它和Lucene以及solr的關係是什麼?
這些是自己的知識獲取能力,自行百度百科
1、下載ElasticSearch的window版,linux版後續說明
自行百度Elastic,然後進到官網進行下載,我的版本是:7.8.0
2、下載postman
自行百度進行下載
3、ElasticSearch中的目錄解讀( 會tomcat,看到這些目錄就不陌生 )
進到bin目錄下,點選 elasticsearch.bat 檔案即可啟動 ES 服務
4、ELK技術是什麼意思?
- 就圖中這三個
0、ES非關係型和關係型資料庫對應關係
注意:ES 7.x之後,type已經被淘汰了,其他的沒變
只要玩ES,那麼這個圖就要牢牢地記在自己腦海裡,後續的名詞解釋不再過多說明,就是操作這幅圖中的東西
1、索引
-
這裡需要解釋一個東西:倒排索引
-
解釋之前先來對照關係型資料庫看一下:正排索引
1.1、建立索引
語法:
http://ip:port/index_name 如:http://127.0.0.1:9200/create_index 請求方式:put
注:put請求具有冪等性
- 指的是: 不管進行多少次重複操作,都是實現相同的結果。可以採用把下面的請求多執行幾次,然後:觀察返回的結果
還具有冪等性的有:put、delete、get
1.1、獲取索引
語法:
http://ip:port/index_name 如:http://127.0.0.1:9200/create_index 請求方式:get
1.3、獲取ES中的全部索引
http://ip:port/_cat/indices?v 如:http://127.0.0.1:9200/_cat/indices?v
1.4、刪除索引
語法:
http://ip:port/index_name 如:http://127.0.0.1:9200/create_index 注意:請求方式為delete
2、文件_doc
2.1、使用post建立doc
這種方式:是採用ES隨機生成id時使用的請求方式
**注:需要先建立索引,因為:這就類似於關係型資料庫中在資料庫的表中 建立資料 **
語法:
http://ip:port/index_name/_doc 如: http://127.0.0.1:9200/create_index/_doc 請求方式:post
2.2、使用put建立doc - 轉冪等性 - 自定義id
在路徑後面加一個要建立的id值即可
2.3、查詢文件_doc - 重點
2.3.1、id查詢單條_doc
語法:
http://ip:port/index_name/_doc/id 如: http://127.0.0.1:9200/create_index/_doc/100001 請求方式:get
2.3.2、查詢ES中索引下的全部_doc
語法:
http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get
注意:別再body中攜帶資料了,不然就會報:
Unknown key for a VALUE_STRING in [title]
返回的結果:
點選檢視程式碼
{
"took": 69, 查詢花費的時間 毫秒值
"timed_out": false, 是否超時
"_shards": { 分片 還沒學,先不看
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.0,
"hits": [ 查詢出來的 當前索引下的所有_doc文件
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 1.0,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": 1.0,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "100001",
"_score": 1.0,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}
2.4、文件_doc的修改
2.4.1、全量修改
原理:利用內容覆蓋,重新發一份文件罷了
語法:
http://ip:port/index_name/_doc/id 如: http://127.0.0.1:9200/create_index/_doc/100001 請求方式:post
獲取_doc文件,檢驗一下
2.4.2、區域性修改
語法:
http://ip:port/index_name/_update/id 如: http://127.0.0.1:9200/create_index/_update/100001 請求方式:post
檢驗一下:
2.5、文件_doc的刪除
使用delete請求即可
2.6、條件查詢 - 重點
2.6.1、url攜帶條件
語法:
http://ip:port/index_name/_search?q=條件欄位:值 如: http://127.0.0.1:9200/create_index/_search?q=author:邪 請求方式:get
注:這種方式不建議用,瞭解即可吧
- 返回的結果體:
點選檢視程式碼
{
"took": 26,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.18232156,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 0.18232156,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": 0.18232156,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}
2.6.2、請求體攜帶條件 - 推薦使用的一種
語法:
http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get
請求體攜帶的資料:
點選檢視程式碼
{
"query": {
"match":{ match 匹配、配對
"author": "邪" 條件
}
}
}
結果返回:
點選檢視程式碼
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.18232156,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 0.18232156,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": 0.18232156,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}
2.7、分頁查詢 - 重點
語法:
http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get
請求體內容:
點選檢視程式碼
{
"query":{
"match_all":{} 注意:這裡使用的是match_all
},
"from": 0, 相當於:startNum
"size": 1 相當於:pageSize
}
返回結果:
點選檢視程式碼
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 1.0,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}
2.8、排序查詢 - 重點
語法:
http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get
請求體內容:
點選檢視程式碼
{
"query":{
"match_all":{}
},
"sort":{ 排序
"_id":{ 根據什麼欄位排序
"order":"desc" 排序方式 desc降序 asc升序
}
}
}
返回結果:
點選檢視程式碼
{
"took": 49,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": null,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
},
"sort": [
"Pty5sX0B_g8Hput6eyzA"
]
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": null,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
},
"sort": [
"Pdy1sX0B_g8Hput6sCw6"
]
}
]
}
}
2.9、多條件查詢 - 重點
2.9.1、and查詢
語法:
http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get
請求體內容:
點選檢視程式碼
{
"query":{
"bool":{
"must":[ 就相當於是mysql中的 and拼接條件
{
"match":{ and條件1
"author":"邪"
}
},{
"match":{ and條件2
"_id":"Pdy1sX0B_g8Hput6sCw6"
}
}
]
}
}
}
返回結果:
點選檢視程式碼
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.1823215,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 1.1823215,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}
2.9.2、or查詢
語法:
http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get
請求體內容:
點選檢視程式碼
{
"query":{
"bool":{
"should":[ 對照must,改變的地方
{
"match":{
"author":"邪"
}
},{
"match":{
"_id":"Pdy1sX0B_g8Hput6sCw6"
}
}
]
}
}
}
返回的結果:
點選檢視程式碼
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.1823215,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 1.1823215,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": 0.18232156,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
}
}
]
}
}
2.10、範圍查詢 - 重點
語法:
http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get
請求體內容:
點選檢視程式碼
{
"query":{
"bool":{
"should":[
{
"match":{
"author":"邪"
}
},{
"match":{
"title":"一"
}
}
],
"filter":{ 就多了這麼一個filter range而已
"range":{
"id":{
"gt":1000 gt > lt < 在html中見過滴
}
}
}
}
}
}
返回結果:下面的兩條資料是我重新加的
點選檢視程式碼
{
"took": 34,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.0,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Vtz2sn0B_g8Hput64ywM",
"_score": 0.0,
"_source": {
"id": 10001,
"title": "大王叫我來巡山",
"author": "王二麻子"
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "V9z5sn0B_g8Hput6HyyQ",
"_score": 0.0,
"_source": {
"id": 10002,
"title": "論皮包龍是怎麼形成的",
"author": "波多野結衣"
}
}
]
}
}
2.11、完全匹配 - 精準匹配 - 重點
-
在玩這個之前可以回到前面看一下我前面例子中的:條件查詢
-
在那裡,老衲做的有一個操作:只用了一個字元:邪,但是:最後得到了想要的結果
-
上面這種:叫做全文檢索,它是去:我建立的create_index索引下的找尋所有的內容,從而匹配出:author包含“邪”的內容,如果此時自己定的條件是:多個字元的話,那麼:底層是把這些字元拆成單個字元了,從而匹配出來的
-
而所謂的完全匹配:就是精準匹配到某條資料,它雖然也會拆成單個字元,但是:查詢時,還是整串字元繫結在一起匹配的
- 如:查詢"紫邪情",用全文檢索就是:紫、邪、情,單獨匹配,從而判定,如果此時:使用"紫邪晴",那麼:也會匹配到
- 但是:如果使用的是完全匹配"紫邪晴",雖然也會拆分為:紫、邪、晴,可是:它最後去匹配結果時,是使用"紫邪晴"這整個字串來比對的,所以:最後結果不會匹配到
語法:
http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get
全文檢索和完全匹配對比
2.12、高亮查詢
語法:
http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get
請求體內容:
點選檢視程式碼
{
"query":{
"match":{
"author":"紫邪情"
}
},
"highlight":{ 高亮
"fields":{ 哪個欄位需要高亮
"author":{}
}
}
}
返回結果:
點選檢視程式碼
{
"took": 59,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 2.264738,
"hits": [
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pdy1sX0B_g8Hput6sCw6",
"_score": 2.264738,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
},
"highlight": {
"author": [
"<em>紫</em><em>邪</em><em>情</em>"
]
}
},
{
"_index": "create_index",
"_type": "_doc",
"_id": "Pty5sX0B_g8Hput6eyzA",
"_score": 2.264738,
"_source": {
"title": "這是第一次學習ES的表資料建立",
"author": "紫邪情",
"sex": "girl"
},
"highlight": {
"author": [
"<em>紫</em><em>邪</em><em>情</em>"
]
}
}
]
}
}
2.13、組合查詢
2.13.1、分組
語法:
http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get
請求體內容:
點選檢視程式碼
{
"aggs": { // 組合操作標識
"author_group": { // 分組之後的名稱 隨便取
"terms": { // 分組標識
"field": "id" // 注意:這裡分組別用字串型別的欄位,如:author
}
}
},
"size": 0 // 設定不顯示原始資料,否則:"hits":{}這個原始資料也會暴露出來
}
加上size之後的返回結果:
點選檢視程式碼
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": null,
"hits": [] // 這裡的hits就被去掉了
},
"aggregations": {
"author_group": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 10001,
"doc_count": 1
},
{
"key": 10002,
"doc_count": 1
}
]
}
}
}
2.13.2、平均數
語法:
http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get
請求體內容:
點選檢視程式碼
{
"aggs":{
"id_avg":{
"avg":{
"field":"id"
}
}
},
"size":0
}
返回結果:
點選檢視程式碼
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"id_avg": {
"value": 10001.5
}
}
}
同樣的道理:sum總和之類的也可以寫的,把標識改為對應的函式名字、field欄位即可
2.14、對映關係
- 就相當於:在做mysql資料庫中的表結構( 欄位構建嘛:欄位名、型別... )
2.14.1、建立索引
點選檢視程式碼
http:127.0.0.1:9200/user // 請求型別:put
2.14.2、建立對映關係
點選檢視程式碼
http://127.0.0.1:9200/user/_mapping // 請求方式:put
// 請求體內容
{
"properties":{
"name":{
"type":"text",
"index":true
},
"age":{
"type":"keyword",
"index":false
},
"address":{
"type":"keyword",
"index":true
}
}
}
// 2、檢視對映關係
http://127.0.0.1:9200/user/_mapping // 請求方式:get
// 3、新增資料
http://127.0.0.1:9200/user/_doc // 請求方式 post
// 請求體內容
{
"name":"紫邪情",
"sex":"女滴",
"age":18,
"address":"地球村"
}
// 4、檢視資料
http://127.0.0.1:9200/user/_search // 請求方式 post
2.14.3、測試
點選檢視程式碼
http://127.0.0.1:9200/user/_search // 請求方式 get
// 請求體內容
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"邪"
}
},{
"match":{
"age":18
}
},{
"match":{
"address":"地球村"
}
}
]
}
}
}
返回結果:
點選檢視程式碼
{
"error": {
"root_cause": [
{
"type": "query_shard_exception",
"reason": "failed to create query: Cannot search on field [age] since it is not indexed.", // 重點資訊在這裡,但是:現在先不解答這個錯誤的原因,繼續測試
"index_uuid": "To8O7VKkR3OM_drdWZQIIA",
"index": "user"
}
],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [
{
"shard": 0,
"index": "user",
"node": "w6AVu2CHT6OEaXAJmqT8mw",
"reason": {
"type": "query_shard_exception",
"reason": "failed to create query: Cannot search on field [age] since it is not indexed.",
"index_uuid": "To8O7VKkR3OM_drdWZQIIA",
"index": "user",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "Cannot search on field [age] since it is not indexed."
}
}
}
]
},
"status": 400
}
上面說:age不允許被index( 檢索 ) , 那麼刪掉它,再看效果
請求體變為如下:
點選檢視程式碼
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"邪"
}
},{ // 去掉了age屬性
"match":{
"address":"地球村"
}
}
]
}
}
}
發現能夠獲取到結果
再變一下:
現在回到前面報的錯:failed to create query: Cannot search on field [age] since it is not indexed
- 為什麼報這個錯?其實已經告知得很清楚了:field [age] since it is not indexed 屬性age不支援被檢索,原因:
為什麼前面使用"地球村"可以查到資料,而使用"地球"就不可以查到?
2.15.5、text和keyword型別的區別
-
text型別支援全文檢索和完全查詢,即:我搜尋時只用字串中的一個字元照樣得到結果
- 原理:text使用了分詞,就是把字串拆分為單個字串了
-
keyword型別支援完全查詢,即:精確查詢,前提:index不是false
- 原理:keyword不支援分詞,所以:查詢時必須是完全查詢( 所有字元匹配上才可以 )