1 - 基於ELK的ElasticSearch 7.8.x 技術整理 - 基礎語法篇 - 更新完畢

紫邪情發表於2021-12-13

準備工作

0、什麼是ElasticSearch?它和Lucene以及solr的關係是什麼?

這些是自己的知識獲取能力,自行百度百科

1、下載ElasticSearch的window版,linux版後續說明

自行百度Elastic,然後進到官網進行下載,我的版本是:7.8.0
image

2、下載postman

自行百度進行下載
image

3、ElasticSearch中的目錄解讀( 會tomcat,看到這些目錄就不陌生 )

image

進到bin目錄下,點選 elasticsearch.bat 檔案即可啟動 ES 服務

4、ELK技術是什麼意思?

  • 就圖中這三個
    image

0、ES非關係型和關係型資料庫對應關係

img

注意:ES 7.x之後,type已經被淘汰了,其他的沒變
只要玩ES,那麼這個圖就要牢牢地記在自己腦海裡,後續的名詞解釋不再過多說明,就是操作這幅圖中的東西

1、索引

  • 這裡需要解釋一個東西:倒排索引

  • 解釋之前先來對照關係型資料庫看一下:正排索引
    image

1.1、建立索引

語法:

http://ip:port/index_name 如:http://127.0.0.1:9200/create_index 請求方式:put

注:put請求具有冪等性

  • 指的是: 不管進行多少次重複操作,都是實現相同的結果。可以採用把下面的請求多執行幾次,然後:觀察返回的結果

還具有冪等性的有:put、delete、get

image

1.1、獲取索引

語法:

http://ip:port/index_name 如:http://127.0.0.1:9200/create_index 請求方式:get

image

1.3、獲取ES中的全部索引

http://ip:port/_cat/indices?v 如:http://127.0.0.1:9200/_cat/indices?v

image

1.4、刪除索引

語法:

http://ip:port/index_name 如:http://127.0.0.1:9200/create_index 注意:請求方式為delete

image

2、文件_doc

2.1、使用post建立doc

這種方式:是採用ES隨機生成id時使用的請求方式

**注:需要先建立索引,因為:這就類似於關係型資料庫中在資料庫的表中 建立資料 **

語法:

http://ip:port/index_name/_doc 如: http://127.0.0.1:9200/create_index/_doc 請求方式:post

image

2.2、使用put建立doc - 轉冪等性 - 自定義id

在路徑後面加一個要建立的id值即可

image

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

image

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]

image

返回的結果:

點選檢視程式碼
{
    "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

image

獲取_doc文件,檢驗一下

image

2.4.2、區域性修改

語法:

http://ip:port/index_name/_update/id 如: http://127.0.0.1:9200/create_index/_update/100001 請求方式:post

image

檢驗一下:

image

2.5、文件_doc的刪除

使用delete請求即可
image

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

注:這種方式不建議用,瞭解即可吧
image

  • 返回的結果體:
點選檢視程式碼
{
    "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": "邪"		條件
        }
    }
}

image

結果返回:

點選檢視程式碼

{
    "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
}

  • image

返回結果:

點選檢視程式碼

{
    "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升序
        }
    }
}

image

返回結果:

點選檢視程式碼

{
    "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"
					}
				}
			]
		}
	}
}

image

返回結果:

點選檢視程式碼
{
    "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"
					}
				}
			]
		}
	}
}

image

返回的結果:

點選檢視程式碼

{
    "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中見過滴
					}
				}
			}
		}
	}
}

image

返回結果:下面的兩條資料是我重新加的

點選檢視程式碼


{
    "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、完全匹配 - 精準匹配 - 重點

  • 在玩這個之前可以回到前面看一下我前面例子中的:條件查詢

  • 在那裡,老衲做的有一個操作:只用了一個字元:邪,但是:最後得到了想要的結果
    image

  • 上面這種:叫做全文檢索,它是去:我建立的create_index索引下的找尋所有的內容,從而匹配出:author包含“邪”的內容,如果此時自己定的條件是:多個字元的話,那麼:底層是把這些字元拆成單個字元了,從而匹配出來的

  • 而所謂的完全匹配:就是精準匹配到某條資料,它雖然也會拆成單個字元,但是:查詢時,還是整串字元繫結在一起匹配的

    • 如:查詢"紫邪情",用全文檢索就是:紫、邪、情,單獨匹配,從而判定,如果此時:使用"紫邪晴",那麼:也會匹配到
    • 但是:如果使用的是完全匹配"紫邪晴",雖然也會拆分為:紫、邪、晴,可是:它最後去匹配結果時,是使用"紫邪晴"這整個字串來比對的,所以:最後結果不會匹配到

語法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get

全文檢索和完全匹配對比
image

image

2.12、高亮查詢

語法:

http://ip:port/index_name/_search 如: http://127.0.0.1:9200/create_index/_search 請求方式:get

請求體內容:

點選檢視程式碼

{
    "query":{
        "match":{
            "author":"紫邪情"
        }
    },
    "highlight":{		高亮
        "fields":{		哪個欄位需要高亮
            "author":{}
        }
    }
}

image

返回結果:

點選檢視程式碼

{
    "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":{}這個原始資料也會暴露出來
}

image

加上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
}

image

返回結果:

點選檢視程式碼

{
    "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":"地球村"
                    }
                }
            ]
        }
    }
}

發現能夠獲取到結果
image

再變一下:
image

現在回到前面報的錯:failed to create query: Cannot search on field [age] since it is not indexed

  • 為什麼報這個錯?其實已經告知得很清楚了:field [age] since it is not indexed 屬性age不支援被檢索,原因:
    • image

為什麼前面使用"地球村"可以查到資料,而使用"地球"就不可以查到?

  • image

2.15.5、text和keyword型別的區別

  • text型別支援全文檢索和完全查詢,即:我搜尋時只用字串中的一個字元照樣得到結果

    • 原理:text使用了分詞,就是把字串拆分為單個字串了
  • keyword型別支援完全查詢,即:精確查詢,前提:index不是false

    • 原理:keyword不支援分詞,所以:查詢時必須是完全查詢( 所有字元匹配上才可以 )

相關文章