1. 程式人生 > >ElasticSearch簡單demo學習

ElasticSearch簡單demo學習

1、單例安裝和head外掛安裝

1)、從Elasticsearch官網下載zip檔案,解壓即可
2)、啟動Elasticsearch,找到安裝目錄中的bin\elasticsearch.bat,雙擊執行,在瀏覽器訪問localhost:9200,顯示elasticsearch基礎資訊,即啟動成功
3)、head外掛的下載:https://github.com/mobz/elasticsearch-head(注意,head外掛的使用要求安裝了node.js換件)
4)、下載head外掛解壓,cd到head目錄中,執行npm install安裝外掛
5)、因為Elasticsearch是兩個不同的域,要進行配置才能在head外掛中實現跨域訪問Elasticsearch。在Elasticsearch的目錄config/elasticsearch.yml,在檔案最後面加上
		http.cors.enabled: true
		http.cors.allow-origin: "*"
6)、啟動head外掛,npm run start,在瀏覽器訪問localhost:9300,即可看到head外掛連上Elasticsearch

2、Elasticsearch分散式安裝

1)、需求:建立一個Elasticsearch叢集,裡面有三個節點,master節點為主節點,slave1和slave2是兩個子節點
2)、配置一個master節點:開啟config/elasticsearch.yml檔案,配置:
																cluster.name: duanss		--表示叢集的名字是duanss
																node.name: master			--表示這個節點的名字 master
																node.master: true			--指定這個節點為主節點master
																network.host: 127.0.0.1 	--繫結一個ip,埠預設9200
3)、複製兩個新解壓的Elasticsearch的資料夾,取名slave1、slave2
		修改slave1的config/elasticsearch.yml:
					cluster.name: duanss			--這個要與主節點一致,表名是在同一叢集下
					node.name: slave1				--節點名字
					network.host: 127.0.0.1 		--繫結一個ip
					http.port: 8200					--指定埠8200,因為預設是9200,與master衝突
					discovery.zen.ping.unicast.hosts: ["127.0.0.1"] 			--給這個節點指定主節點的ip
					
		修改slave2的config/elasticsearch.yml:
					cluster.name: duanss			--這個要與主節點一致,表名是在同一叢集下
					node.name: slave2				--節點名字
					network.host: 127.0.0.1 		--繫結一個ip
					http.port: 7200					--指定埠7200,因為預設是9200,與master衝突
					discovery.zen.ping.unicast.hosts: ["127.0.0.1"] 			--給這個節點指定主節點的ip

3、Elasticsearch基礎概念

1)、索引:含有相同屬性的文件集合(例如:可以用一個索引來代表消費者的資料,另一個索引代表產品的資料)
2)、型別:一個索引裡面可以定義一個或多個型別,但是文件必須屬於一個型別,通常會定義相同欄位的文件作為一個型別
3)、文件:文件是可以被索引的基本資料單位(例如:一個使用者的基本資訊)
	總結:索引相當於一個數據庫,型別相當於一個table,文件相當於table中的一行記錄
4)、分片:每個索引都有多個分片,每個分片都是一個Lucene索引
5)、備份:拷貝一份分片,就完成了分片的備份

4、Elasticsearch基本使用

1)、索引建立:使用head外掛,直接建立索引,建立是可以指定分片數和備份數,預設是5個分片,一個備份(是每個分片一個備份),這兩個資料只能在建立索引時指定,後續不能再修改
					檢視索引的基本資訊,mappings的值為空,表示是非結構化建立,反之即為結構化建立
		Elasticsearch 有自己的RESTFul API,基本格式:http://<ip>:<port>/<索引>/<型別>/<文件id>
			例如:
				可以使用http的PUT方式,訪問http://localhost:9200/people
					body為json資料:
							{
								"settings": {
									"number_of_shards": "3",
									"number_of_replicas": "0"
								},
								"mappings": {
									"man": {
										"properties": {
											"name": {
												"type": "text"
											},
											"country": {
												"type": "keyword"
											},
											"age": {
												"type": "integer"
											},
											"date": {
												"type": "date",
												"format": "yyyy-MM-dd HH:ss:dd||yyyy-MM-dd"
											}
										}
									},
									"woman": {}
								}
							}
					含義解釋:建立一個名為people的索引,分片數為3,備份數為0;索引裡有兩個型別man, woman(表示有兩個table:man and woman),man這個table中有欄位name,country,age,date。woman沒有欄位
		
		
2)、資料插入:
		指定文件id插入:
			PUT 	http://localhost:9200/people/man/1  body:{
																"name": "段鬆鬆",
																"country": "China",
																"age": 25,
																"date": "1994-05-06"
															 }										給man這個type插入一條文件id為1的記錄
			
		不指定文件id,讓Elasticsearch自動生成文件id
			POST 	http://localhost:9200/people/man  body:{
																"name": "段鬆鬆",
																"country": "China",
																"age": 25,
																"date": "1994-05-06"
															 }
															 
3)、資料修改
		直接修改文件:
			POST 	http://localhost:9200/people/man/1/_update(_update表示是修改操作) body:{
																								"doc": {
																									"name": "誰是段鬆鬆"
																								}
																							}
		
		通過指令碼修改文件
			POST 	http://localhost:9200/people/man/1/_update(_update表示是修改操作) body:{
																								"script": {
																									"lang": "painless",
																									"inline":  "ctx._source.name = params.name;ctx._source.age = params.age",
																									"params": {
																										"age": 100,
																										"name": "段鬆鬆"
																									}
																								}
																							}
																							"lang": "painless"    --表示es內建的指令碼語言
																							"params" 			  --定義了一些引數
																							ctx._source			  --表示當前文件的物件
																							
4)、刪除(沒有刪除型別的方法)
		刪除文件:Delete 		http://localhost:9200/people/man/1
		刪除索引:Delete 		http://localhost:9200/people
		
5)、查詢Elasticsearch中的資料
		GET 	http://localhost:9200/book/novel/1		查詢book索引下novel型別下的文件id是1的記錄
		POST	http://localhost:9200/book/_search		--查詢book索引下的所有資料
				http://localhost:9200/book/novel/_search		--查詢book索引novel型別下的所有資料		(_search是關鍵字)
														body:{
																"query": {
																	"match_all": {}
																},
																"from": 1,
																"size": 1,
																"sort": [{
																	"publish_date":  {"order": "desc"}
																}]
															}		query 關鍵字 , from從第幾條開始返回,size返回的條數
																	match_all 表示匹配所有,當要條件查詢時,使用 	"match": {							
																																"title": "2"
																															}				模糊查詢
																	結果預設是升序排序 "sort": [{
																								"publish_date":  {"order": "desc"}
																							}]	表示通過 publish_date 欄位降序排序
																							
		聚合查詢  POST http://localhost:9200/book/novel/_search
		
														{
															"aggs": {
																"group_by_word_count": {
																	"terms": {
																		"field": "word_count"
																	}
																},
																"grades_word_count": {
																	"stats": {
																		"field": "word_count"
																	}
																}
															}
														}			aggs -- 關鍵字 ,group_by_word_count --自定義的聚合名,terms --關鍵字, "field": "word_count"   --通過word_count來分組聚合查詢
																	通過多個欄位和聚合,再多加 group_by_word_count 這種即可
																	stats  -- 關鍵字,表示通過word_count欄位計算,max、min、sum、avg、count等等,也可以吧stats直接改成函式名

5、ElasticSearch高階查詢

  1)、query context:
		es在查詢過程中,除了判斷文件是否滿足查詢條件外,還有計算一個_score來標識匹配的程度,表明判斷目標文件和查詢條件匹配的有多好
			a)、全文字查詢,針對文字型別的資料text
				
				POST	http://localhost:9200/book/_search		api
						模糊匹配:{"query": {"match": {"author": "瓦力"}}}			--因為 author欄位是keyword型別,所以這裡要是全匹配,而不是模糊查詢
								  {"query": {"match": {"title": "ElasticSearch"}}}	title 是text文字格式,所以這裡是模糊查詢  返回結果有 "_score": 0.25316024, 表示匹配程度
								  {"query": {"match": {"title": "ElasticSearch入門"}}}  這樣的模糊查詢,會查詢title中包括ElasticSearch 或者 入門 的所有記錄
						
						習語匹配:
								  {"query": {"match_phrase": {"title": "ElasticSearch入門"}}}  這樣會對title進行全匹配,相當於 = 符號
						多個欄位模糊匹配:
								  {"query": {"multi_match": {"query": "瓦力", "fields": [{"author","title"}]}}}}		查詢author或者title中包含 瓦力 的記錄,這裡相當於 author=瓦力 or tilte like 瓦力
								  
						query_string:通過一些語法來進行查詢
						{"query": {"query_string": {"query": "(ElasticSearch AND 大法) OR Python"}}}		查詢包括(ElasticSearch並且包括 大法) 或者 (Python)的資料,這裡沒有指定欄位,查全部欄位,而且 AND 和 OR 必須大寫
								要指定查詢的欄位,則加上"fileds": ["author","title"]
								
			b)、欄位級別的查詢,針對結構化資料,如數字,日期,這個也可以針對keyword型別的欄位	
						{"query": {"term": {"word_count": 1000}}}		查詢word_count是1000的記錄
					範圍查詢:{"query": {"range": {"word_count": {"gte": 1000,"lte": 2000}}}}		查詢word_count在大於等於1000,小於等於2000的記錄   ,當對時間欄位進行篩選時,現在的時間使用 now 關鍵字
					
2)、Filter context 過濾查詢
		這個只會返回是否查到資料,不會返回匹配的程度
			a)、{"query": {"bool": {"filter": {"term": {"word_count": 1000}}}}}			過濾查詢 word_count 為1000的記錄,filter要結合bool關鍵字一起查詢,並且會把資料進行快取到記憶體
			
3)、複合查詢
		a)、固定分數查詢
				{
					"query": {
						"constant_score": {
							"filter": {
								"match": {
									"title": "ElasticSearch"
								}
							},
							"boost": 2
						}
					}
				}				constant_score 表示固定分數	,   "boost": 2  表示指定分數為2
				
		b)、bool關鍵字的查詢
				{
					"query": {
						"bool": {
							"should": [
								{
									"match": {
										"author": "瓦力"
									}
								},
								{
									"match": {
										"title": "ElasticSearch"
									}
								}
							]
						}
					}
				}				這個方式使用了should關鍵字。表示滿足這兩個match之一的記錄
				{
					"query": {
						"bool": {
							"must": [
								{
									"match": {
										"author": "瓦力"
									}
								},
								{
									"match": {
										"title": "ElasticSearch"
									}
								}
							],
							"filter": [{
								"term": {
									"word_count": 1000
								}
							}]
						}
					}
				}			這個方式使用了must關鍵字。表示要同事滿足這兩個match的記錄.			同時與filter關鍵字一起使用
				{
					"query": {
						"bool": {
							"must_not": {
								"term": {
									"author": "瓦力"
								}
							}
						}
					}
				}		must_not關鍵字,表示author不是瓦力的記錄