ElasticSeasrch 基礎用法

一. 基本概念

索引:有相同屬性的文檔集合(比如一個數據庫)注:英文字母小寫html

類型:索引能夠定義一個或者多個類型,文檔必須屬於一個類型(至關與一張表)數據庫

文檔:文檔是能夠背索引的基本數據單位(至關於一條數據)json

和索引相關的有「分片」和「備份」:數組

分片:每一個索引都有多個分片,每一個分片是一個Lucene索引app

注:假如一個索引數據量很大,就會產生硬盤壓力很大。因此就要‘分片’來分擔壓力。能夠水平的擴展和拆分以及分佈式的操做,能夠提升搜索和其餘操做。ES默認建立索引時會建立5個分片,1個備份。分片的數量只能在建立索引時指定,不能在後期修改,而備份是能夠動態修改的less

備份:拷貝一份分片就完成了分片的備份,注:當一個主分片失敗或出現問題時,"備份分片"就能夠代替工做,從而提升了ES的可用性,備份的分片還能夠執行搜索的操做,來分攤搜索的壓力。elasticsearch

二. 基礎用法

RESTful API:分佈式

基本格式:http://<ip>:<port>/<索引>/<類型>/<文檔id>函數

經常使用http動詞:GET/PUT/POST/DELETEpost

Ⅰ. 建立索引

①. 非結構化建立

建立book索引成功後以下圖:

②. 結構化建立

打開postman,按圖操做:

主要就是在postman中新建了一個people索引,而且配置了mappings配置項,主要配置內容爲:

{
	"settings":{                
		"number_of_shards":3,    
		"number_of_replicas":1   
	},
	"mappings":{
		"man":{
			"properties":{
				"name":{
					"type":"text"
				},
				"country":{
					"type":"keyword"
				},
				"age":{
					"type":"integer"
				},
				"date":{
					"type":"date",
					"format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
				}
			}
		}
	}
	
}

注:低版本的es不支持"type" : "text"改爲 "type" : "String" 就好

發送命令後建立成功會看到以下圖所示:

建立了三個分片一個備份

並且mapping中包含建立索引時的結構化信息:

③. 修改索引的 mapping

還能夠在已經建立好的索引上修改mappings,具體能夠參看這篇文章:https://www.cnblogs.com/yepei/p/6730690.html,主要操做:

image

Ⅱ. 插入

①. 指定文檔id插入

如圖,url中指定了文檔id爲1,根據先前定義好的結構化類型參數進行json賦值,點擊send後控制檯返回

點擊數據瀏覽就可看到咱們以前插入的數據:

②. 自動產生文檔id插入

自動產生文檔id插入的操做十分簡單,只須要把提交方式改成「post」,另外把url中指定的id去掉(此處要自動生成),點send便可:

從控制檯返回的消息中咱們能夠看到,已經自動產生了文檔id

刷新head的數據瀏覽界面可見新插入的數據:

Ⅲ. 修改

①. _update命令修改文檔

如圖,經過 RESTful API 直接修改文檔十分簡單,只須要在文檔id後指定要執行的操做(這裏執行修改操做,即_update),而後把要修改的內容寫到」doc「中,選擇POST提交便可

②. PUT方式修改文檔

更新記錄就是使用 PUT 請求,從新發送一次數據

摘自:http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html

③. 經過腳本修改文檔

該方法和上面一種方法只在輸入的json內容上有不一樣:

{
	"script":{
		"lang":"painless",
		"inline":"ctx._source.age=params.age",
		"params":{
			"age":100
		}
	}
}

如上所示,將修改操做寫進」script「中,指定腳本語言爲」painless「,ctx表示當前上下文,_source表示源碼,這裏將age做爲參數傳入,進行修改

Ⅳ. 刪除

①. 刪除文檔

只須要在url中加上要刪除的文檔id,選擇DELETE方式提交請求便可,如刪除索引people中man類型的文檔1:

②. 刪除索引

能夠直接在head插件中刪除,也可使用uri的方式,如刪除people索引:

Ⅴ. 查詢

①. 簡單查詢

a. 查詢id爲1的文檔:

b. 返回novel類型下全部文檔:

②. 條件查詢

a. 查詢全部數據,從位置1開始,只返回一條結果:

{
	"query":{
		"match_all":{}
	},
    "from":1,
    "size":1

}

查詢語句如上,要寫在」query「裏,"match_all"表示查詢全部,」from「 指定位移(默認從0開始),」size「表示顯示記錄條數(默認10條)查詢結果以下:

{
    "took": 6,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 6,
        "max_score": 1,
        "hits": [
            {
                "_index": "book",
                "_type": "novel",
                "_id": "v4A5GWIBAZIrIv_UKnkq",
                "_score": 1,
                "_source": {
                    "author": "李六",
                    "publish_date": "1995-03-15",
                    "tittle": "es哈哈哈學習",
                    "word_count": 30000
                }
            }
        ]
    }
}

上面代碼中,返回結果的 took字段表示該操做的耗時(單位爲毫秒),timed_out字段表示是否超時,hits字段表示命中的記錄,裏面子字段的含義以下。

  • total:返回記錄數,本例是 2 條。
  • max_score:最高的匹配程度,本例是1.0
  • hits:返回的記錄組成的數組。

返回的記錄中,每條記錄都有一個_score字段,表示匹配的程序,默認是按照這個字段降序排列。

b. 設置score排序規則,按照」publish_date「字段降序排列:

{
	"query":{
		"match":{
			"tittle":"es學習"
		}
	},
	
	"sort":[
		{"publish_date":{"order":"desc"}}
	]
		
}

查詢結果:

{
    "took": 243,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 3,
        "max_score": null,
        "hits": [
            {
                "_index": "book",
                "_type": "novel",
                "_id": "voA4GWIBAZIrIv_UcHlf",
                "_score": null,
                "_source": {
                    "author": "王五",
                    "publish_date": "1995-03-17",
                    "tittle": "es學習",
                    "word_count": 20000
                },
                "sort": [
                    795398400000
                ]
            },
            {
                "_index": "book",
                "_type": "novel",
                "_id": "v4A5GWIBAZIrIv_UKnkq",
                "_score": null,
                "_source": {
                    "author": "李六",
                    "publish_date": "1995-03-16",
                    "tittle": "es哈哈哈學習",
                    "word_count": 30000
                },
                "sort": [
                    795312000000
                ]
            },
            {
                "_index": "book",
                "_type": "novel",
                "_id": "wIA5GWIBAZIrIv_UlXlz",
                "_score": null,
                "_source": {
                    "author": "田七",
                    "publish_date": "1995-03-15",
                    "tittle": "es稀里嘩啦",
                    "word_count": 30000
                },
                "sort": [
                    795225600000
                ]
            }
        ]
    }
}

如上查詢結果,」_score「字段爲null,由於這裏自定義了排序規則,結果按照」publish_date「降序排列

③. 聚合查詢

a. 分別按照」word_count「和」publish_date「進行聚合查詢

{
	"aggs":{
		"group_by_word_count":{
			"terms":{
				"field":"word_count"
			}
		},
		
		"group_by_publish_date":{
			"terms":{
				"field":"publish_date"
			}
		}
	}
		
}

聚合查詢要使用」aggs「字段,後面的」group_by_word_count「以及」group_by_publish_date「是自定義的聚合查詢名稱,而後在」terms「字段下用」field「指明要聚合的字段,查詢結果以下:

"aggregations": {
        "group_by_publish_date": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": 795225600000,
                    "key_as_string": "1995-03-15 00:00:00",
                    "doc_count": 4
                },
                {
                    "key": 795312000000,
                    "key_as_string": "1995-03-16 00:00:00",
                    "doc_count": 1
                },
                {
                    "key": 795398400000,
                    "key_as_string": "1995-03-17 00:00:00",
                    "doc_count": 1
                }
            ]
        },
        "group_by_word_count": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": 30000,
                    "doc_count": 3
                },
                {
                    "key": 4000,
                    "doc_count": 1
                },
                {
                    "key": 20000,
                    "doc_count": 1
                },
                {
                    "key": 50000,
                    "doc_count": 1
                }
            ]
        }
    }

b. 其餘功能函數的使用:

{
	"aggs":{
		"grades_word_count":{
			"stats":{
				"field":"word_count"
			}
		}
	}
		
}

上述查詢語句對「word_count」字段進行計算,查詢結果以下:

"aggregations": {
        "grades_word_count": {
            "count": 6,
            "min": 4000,
            "max": 50000,
            "avg": 27333.333333333332,
            "sum": 164000
        }
    }

求出了最小值,最大值,平均值等。

參考資料:

http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html(阮一峯老師的博客,該博客還提到了中文分詞器ik的安裝,能夠參考)

相關文章
相關標籤/搜索