ElasticSearch 安裝與使用
目錄
- Elastic Search
- Docker中安裝ElasticSearch
- Elastic Search API得使用
- 建立Index:
- 修改Index Mapping:
- 修改Index Settings:
- 建立Index模板:
- 單條件查詢: [query->term]
- 多條件查詢: [query->bool->must->term]
- 對查詢結果進行摺疊去重一個欄位: [collapse]
- 對查詢結果進行摺疊去重兩個欄位: [collapse->inner_hits->collapse]
- 對查詢結果進行聚合實現Group BY: [aggerations]
- 對查詢結果進行聚合最大值/最小值: [aggs->min/max]
- 對查詢結果進行聚合時,需要使用其他資料: [aggs->top_hits]
- 在查詢Payload中寫邏輯運算: [script]
- 在更新Payload中寫邏輯運算: [script]
- 依據查詢條件進行更新
- 依據查詢條件進行刪除
- 簡單得分頁查詢:[from size]
- 複雜得分頁查詢:[scroll]
- 多條插入資料:[_bulk]
- 重新索引:[reindex]
- 檢視所有index:[_cat/indices/]
- 設定Cluster:[_cluster]
- 刪除所有生成的Scroll
- 已知文件Id情況下存在更新,不存在插入資料[update]
- 提高 ES效率
Elastic Search
Docker中安裝ElasticSearch
需要Java環境
- 下載tar.gz並解壓,並移動
mv elasticsearch-7.1.0 /usr/local/elasticsearch
- 修改配置
vi /usr/local/elasticsearch/config/elasticsearch.yml
- yml檔案
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
# 7.1 版本即便不是多節點也需要配置一個單節點,否則
#the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
cluster.initial_master_nodes: ["node-1"]
# 配置indices fielddata得記憶體,超過80%就會釋放
indices.fielddata.cache.size: 80%
# request數量使用記憶體限制,預設為JVM堆的40%。
indices.breaker.request.limit: 80%
- 建立一個非
root
使用者elsearch
來執行elasticsearch指令碼。ES不能用root使用者啟動
# elasticsearch can not run elasticsearch as root
adduser elsearch # 會自動建組 test
# 將資料夾以及子資料夾全部該為test使用者
chown -R elsearch:elsearch elasticsearch
ll
# drwxr-xr-x 1 elsearch elsearch 4096 May 28 16:54 elasticsearch
- 7.X新特性
- removal mapping types官方:https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html
目前版本有一個預設的type _doc,使用api對文件操作的時候,也不需要在url上加入 type了,直接index即可,具體的api可以大部分都可以通過在url去掉type進行操作。
- not_analyzed不存在了,如果需要不拆分
可以對index進行analyzer設定,將預設的analyzer設定成keyword就不會拆分了。
----------------------------------------------------------------
設定analyzer:需要先關閉index
1. POST http://server_ip/index_name/_close?pretty
2. PUT : http://server_ip/index_name/_settings?pretty
BODY:
{
"index":{
"analysis" : {
"analyzer" : {
"default" : {
"type" : "keyword"
}
}
}
}
}
3. POST http://server_ip/index_name/_open?pretty
- 沒有
string
這個 column type了。可以換成text
或者keyword
- 在查詢中,新增
{"track_total_hits":true}
,可以查詢出total得總數。不會被限制成10000
Elastic Search API得使用
介紹本次BGP專案中使用到得API得使用方法以及某些特定Payload得寫法
注:沒有使用順序,每個payload不是唯一得寫法。
建立Index:
PUT
your_server_ip:9200/index_name
- Payload
{
"settings": {
"number_of_shards": 5,
"analysis": {
"analyzer": {
"default": {
"type": "keyword"
}
}
},
"refresh_interval": "30s",
"max_result_window" : "1000000",
"max_rescore_window": "1000000"
},
"mappings": {
"properties": {
"test": {
"type": "keyword"
}
}
}
- 說明
settings
設定index,mappings
設定index得columnnumber_of_shards
:分片數量,analysis
:此處是為了不適用分詞,這個是7.x版本新的設定方式refresh_interval
:設定重新整理時間,為了最大化_bulk
得效率,最好設定30s左右max_result_window
:ES預設只能查詢10000條資料,使用scroll
API可以查詢到max_result_window得數量得資料max_rescore_window
:rescore
API使用,本次沒有使用到
修改Index Mapping:
PUT/POST
your_server_ip:9200/index_name/_mappings
- Payload
{
"properties": {
"test": {
"type": "keyword"
}
}
- 說明
- 可以新增column
- 有一些欄位型別得更改是不被允許得,只能使用
_reindex
API - 直接在
Payload
中傳入properties
即可
修改Index Settings:
PUT/POST
your_server_ip:9200/index_name/_settings
- Payload
{
"index":{
"analysis" : {
"analyzer" : {
"default" : {
"type" : "keyword"
}
}
},
"refresh_interval": "30s",
"max_result_window" : "1000000",
"max_rescore_window": "1000000"
}
}
- 說明
- 可以一次性設定多個index,url中 index_name=
index1,index2,index3
- 某些更改設定,必須使用
_close
API關閉index,比如analysis
建立Index模板:
PUT
your_server_ip:9200/_template/template_name
- Payload
{
"index_patterns": ["test*"],
"settings": {
"number_of_shards": 1,
"analysis": {
"analyzer": {
"default": {
"type": "keyword"
}
}
},
"refresh_interval": "30s",
"max_result_window" : "1000000",
"max_rescore_window": "1000000"
},
"mappings": {
"properties": {
"state": {
"type": "keyword"
}
}
}
}
- 說明
index_patterns
表示以test
開頭得index都擁有如下得setting
與mapping
- 模板得意義在於,我們基於時間建立index時,不需要每次都新增index得
setting
和mapping
單條件查詢: [query->term]
POST/GET
your_server_ip:9200/index_name/_search
- Payload
{
"query": {
"term": { "router_name": "test" }
}
}
- 說明
- 如上只是一個見到得精確匹配
router_name
是test
得所有文件
多條件查詢: [query->bool->must->term]
POST/GET
your_server_ip:9200/index_name/_search
- Payload
{
"query": {
"bool":{
"must":[
{"term": { "router_name": "test" }},
{
"range": {
"count": {
"gte": 700000,
"lt": 800000
}
}
}
]
}
}
}
- 說明
- 兩個查詢條件,包括一個精確得一個範圍得
bool
下使用must
表示,兩個條件都需要滿足bool
下還有must_not
,should
可以使用,具體參照官網。
對查詢結果進行摺疊去重一個欄位: [collapse]
POST/GET
your_server_ip:9200/index_name/_search
- Payload
{
"sort": [
{
"timestamp": "desc"
}
],
"collapse": {
"field": "field1"
}
}
- 說明
- 排序是為了摺疊後留下最大得時間戳資料
對查詢結果進行摺疊去重兩個欄位: [collapse->inner_hits->collapse]
POST/GET
your_server_ip:9200/index_name/_search
- Payload
{
"size": 10000,
"sort": [
{
"timestamp": "desc"
}
],
"collapse": {
"field": "f1",
"inner_hits": {
"name": "peer",
"collapse": {
"field": "f2"
},
"size": 10000
}
}
}
- 說明
- 再
collapse
中使用inner_hits
再次巢狀一個collapse
對查詢結果進行聚合實現Group BY: [aggerations]
POST/GET
your_server_ip:9200/index_name/_search
- Payload
{
"sort": [
{
"timestamp": {
"order": "desc"
}
}
],
"aggs":{
"group1":{
"terms":{
"field":"f1"
},
"aggs":{
"group2":{
"terms":{
"field":"f2"
},
"aggs":{
"group3":{
"terms":{
"field":"f3"
},
"aggs":{
"max_timestamp":{
"max":{
"field":"timestamp"
}
}
}
}
}
}
}
}
}
}
- 說明
- 上面使用四層聚合,最後一層是求最大得時間戳的,
- 舉個例子:f1:中國 f2:北京 f3:昌平,
- ES中,多層聚合只能巢狀,而且在聚合後資料量很大的情況下,最好想別的辦法解決
aggs
是關鍵字aggerations
得縮寫,ES都可以識別
對查詢結果進行聚合最大值/最小值: [aggs->min/max]
POST/GET
your_server_ip:9200/index_name/_search
- Payload
{
"sort": [
{
"timestamp": {
"order": "desc"
}
}
],
"aggs":{
"group1":{
"terms":{
"field":"f1"
},
"aggs":{
"group2":{
"terms":{
"field":"f2"
},
"aggs":{
"group3":{
"terms":{
"field":"f3"
},
"aggs":{
"max_timestamp":{
"max":{
"field":"timestamp"
}
}
}
}
}
}
}
}
}
}
- 說明
- 上面使用四層聚合,最後一層是求最大得時間戳的,
- 舉個例子:f1:中國 f2:北京 f3:昌平,
- ES中,為了表示遞進關係只能巢狀聚合,在聚合後資料量很大的情況下,最好想別的辦法解決
aggs
是關鍵字aggerations
得縮寫,ES都可以識別- 聚合中還可以算
sum
avg
等。參照Metrics Aggregations
對查詢結果進行聚合時,需要使用其他資料: [aggs->top_hits]
POST/GET
your_server_ip:9200/index_name/_search
- Payload
{
"aggregations": {
"unique_key_group": {
"terms": {
"field": "f1",
"size": "100000"
},
"aggregations": {
"max_timestamp": {
"max": {
"field": "timestamp"
}
},
"top_hit_for_group": {
"top_hits": {
"size": 1,
"sort": [
{
"timestamp": {
"order": "desc"
}
}
]
}
}
}
}
}
}
- 說明
- 對一個欄位進行聚合,但是,聚合之後 還需要用到別的欄位的資料
- 在第一個聚合中,寫入子聚合
top_hits
,並對時間排序,取到最大時間戳得資料
在查詢Payload中寫邏輯運算: [script]
POST/GET
your_server_ip:9200/index_name/_search
- Payload
{
"script_fields": {
"my_f1": {
"script": {
"lang": "expression",
"source": "doc['f1'] * multiplier",
"params": {
"multiplier": 2
}
}
}
}
}
- 說明
- 如上是對欄位
f1
進行乘2得運算 - 如上可以是哦嫩滾
params
設定引數。
在更新Payload中寫邏輯運算: [script]
POST/GET
your_server_ip:9200/index_name/_update_by_query
- Payload
{
"script": {
"source": "ctx._source.state='Down'"
}
}
- 說明
- 如上是對欄位
state
進行更新,更新成Down
資料 - 關於
script
參照官網 Scripting
依據查詢條件進行更新
POST
your_server_ip:9200/index_name/_update_by_query
- Payload
{
"script": {
"source": "ctx._source.state='json.peer_down'",
"lang": "painless"
},
"query": {
"bool": {
"must": [
{
"term": {
"f1": "1"
}
},
{
"term": {
"f2": "2"
}
}
]
}
}
}
- 說明
- 如上是按照查詢條件查詢到資料,並將所有查詢到資料得
state
更新為Down
依據查詢條件進行刪除
POST/GET
your_server_ip:9200/index_name/_delete_by_query
- Payload
{
"query": {
"bool": {
"must": [
{
"term": {
"f1": "1"
}
},
{
"term": {
"f2": "2"
}
}
]
}
}
}
- 說明
- 如上是按照查詢條件查詢到資料,並將所有查詢到資料刪除掉。
- 如果想清空資料表可以傳入
matchall
得匹配{"query": {"match_all": {}}}
或者在url中加入引數?q=*:*
- 這個操作不會刪除掉
index
簡單得分頁查詢:[from size]
POST
your_server_ip:9200/index_name/_delete_by_query
- Payload
{
"from":1,
"size":10
}
- 說明
- 如上是從第一個資料開始,查詢10個,至於分頁基礎引數,計算之後傳入即可
複雜得分頁查詢:[scroll]
POST
your_server_ip:9200/index_name/_search?scroll=10m&size=10000
- Payload
{"query": {"match_all": {}}}
POST
your_server_ip:9200/_search/scroll
- Payload
{"scroll_id":"DnF1ZXJ5VGhlbkZldGNoDwAAAAAAAZOqFjJ2c0lSa2ZPUzlpcFpxWHYwYldpbncAAAAAAAGTqBYydnNJUmtmT1M5aXBacVh2MGJXaW53AAAAAAABk6kWMnZzSVJrZk9TOWlwWnFYdjBiV2ludwAAAAAAAZOrFjJ2c0lSa2ZPUzlpcFpxWHYwYldpbncAAAAAAAGTrBYydnNJUmtmT1M5aXBacVh2MGJXaW53AAAAAAABk64WMnZzSVJrZk9TOWlwWnFYdjBiV2ludwAAAAAAAZOtFjJ2c0lSa2ZPUzlpcFpxWHYwYldpbncAAAAAAAGTsxYydnNJUmtmT1M5aXBacVh2MGJXaW53AAAAAAABk68WMnZzSVJrZk9TOWlwWnFYdjBiV2ludwAAAAAAAZOyFjJ2c0lSa2ZPUzlpcFpxWHYwYldpbncAAAAAAAGTsBYydnNJUmtmT1M5aXBacVh2MGJXaW53AAAAAAABk7EWMnZzSVJrZk9TOWlwWnFYdjBiV2ludwAAAAAAAZO2FjJ2c0lSa2ZPUzlpcFpxWHYwYldpbncAAAAAAAGTtBYydnNJUmtmT1M5aXBacVh2MGJXaW53AAAAAAABk7UWMnZzSVJrZk9TOWlwWnFYdjBiV2ludw=="
}
- 說明
- 第一個查詢,會得到一個scroll_id
- 10m代表,當前scroll_id有效時間是10分鐘
- 第二個查詢,拿到這個
scrolll_id
之後,一隻訪問_search/scroll
API,知道獲取到當前index
得所有資料為止
多條插入資料:[_bulk]
POST
your_server_ip:9200/_bulk
- Payload
{ "index" : { "_index" : "test" } }
{"state":"111"}
{ "index" : { "_index" : "test", "_id" : "4" } }
{"state":"222"}
- 說明
bulk
插入時,不需要再url中寫入index
只需要再payload
中傳入即可。- 注意一行得空行,時必須得,ES會檢查出錯誤
- 提醒一下,再使用
Python
或者Java
傳送http請求時,需要再每一行中都嚴格插入\n
否則bulk
API會失敗 _id
可傳,可不傳,如果不傳入,ES會自動生成一個。- 在
bulk
中插入index
中沒有得欄位也是被允許得。 bulk
API不會檢測index
是否存在,即便不存在得index
也可以正常插入。關於
bulk
得效率問題,經過測試每次10000
每次15000
每次20000
效率最高得時每次15000
- 上面提到過為了提高
bulk
得效率,最好設定refresh_interval
大一點,30秒左右。 bulk
中是可以做,增、刪、改、插,四個操作的,每一個都是單獨的。
重新索引:[reindex]
POST
your_server_ip:9200/_reindex
- Payload
{
"source": {
"index": "old_index"
},
"dest": {
"index": "new_index"
}
}
- 說明
- 上面說過,當一個
index
被建立,欄位得型別是不允許更改得,這個時候可以用reindex
來遷移資料。
檢視所有index:[_cat/indices/]
POST
your_server_ip:9200/_cat/indices/
- 說明
- 每一列得意義
health
status
index
uuid
pri
rep
docs.count
docs.deleted
store.size
pri.store.size
設定Cluster:[_cluster]
POST
your_server_ip:9200/_cluster/settings
- Payload
{
"persistent": {
"search.max_buckets": 100000000,
"search.max_open_scroll_context": 1000000
}
}
- 說明
- 可以叢集設定。
max_buckets
此處設定,只要是ES中聚合aggregations
的buckets
數量預設是有限制的。max_open_scroll_context
,對對能夠開啟的scroll
查詢的個數
刪除所有生成的Scroll
DELETE
http://10.75.44.100:9200/_search/scroll/_all
- 說明
- Scroll的數量是有限制的,最好不要開太多。
已知文件Id情況下存在更新,不存在插入資料[update]
POST
http://10.75.44.100:9200/index_name/_update/document_id
- Payload
{
"script" : {
"source": "ctx._source.counter += params.count",
"lang": "painless",
"params" : {
"count" : 4
}
},
"upsert" : {
"counter" : 1
}
}
- 說明
- 如上是
upsert
。如果document_id
存在,就將counter
更新為4,不存在,則插入資料1,很實用。
提高 ES效率
關閉source:經測試不能關閉,關閉只是在當前欄位為查詢條件得情況下,關閉後可以提高某查詢效率查到id後去mysql中查詢具體資料,關閉後的欄位將不能被查詢出來使用。
開啟最佳壓縮(未設定)
設定延遲重新整理