1. 程式人生 > >ElasticSearch 安裝與使用

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新特性
  1. 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進行操作。
  1. 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
  1. 沒有string這個 column type了。可以換成text或者keyword
  2. 在查詢中,新增{"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"
        }
    }
}
  • 說明
  1. settings設定index,mappings設定index得column

  2. number_of_shards:分片數量,

  3. analysis:此處是為了不適用分詞,這個是7.x版本新的設定方式

  4. refresh_interval:設定重新整理時間,為了最大化_bulk得效率,最好設定30s左右

  5. max_result_window:ES預設只能查詢10000條資料,使用scroll API可以查詢到max_result_window得數量得資料

  6. max_rescore_windowrescore API使用,本次沒有使用到

修改Index Mapping:

PUT/POST your_server_ip:9200/index_name/_mappings

  • Payload
{
    "properties": {
        "test": {
        "type": "keyword"
    }
}
  • 說明
  1. 可以新增column
  2. 有一些欄位型別得更改是不被允許得,只能使用_reindexAPI
  3. 直接在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"
    }
}
  • 說明
  1. 可以一次性設定多個index,url中 index_name= index1,index2,index3
  2. 某些更改設定,必須使用_closeAPI關閉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"
        }
      }
    }
}
  • 說明
  1. index_patterns表示以 test開頭得index都擁有如下得settingmapping
  2. 模板得意義在於,我們基於時間建立index時,不需要每次都新增index得settingmapping

單條件查詢: [query->term]

POST/GET your_server_ip:9200/index_name/_search

  • Payload
{
    "query": {
        "term": { "router_name":    "test"  }
    }
}
  • 說明
  1. 如上只是一個見到得精確匹配 router_nametest得所有文件

多條件查詢: [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
                        }
                    }
                }
            ]
        }
        
    }
}
  • 說明
  1. 兩個查詢條件,包括一個精確得一個範圍得
  2. bool下使用must表示,兩個條件都需要滿足
  3. bool下還有must_notshould可以使用,具體參照官網。

對查詢結果進行摺疊去重一個欄位: [collapse]

POST/GET your_server_ip:9200/index_name/_search

  • Payload
{
    "sort": [
        {
            "timestamp": "desc"
        }
    ],
    "collapse": {
        "field": "field1"
    }
}
  • 說明
  1. 排序是為了摺疊後留下最大得時間戳資料

對查詢結果進行摺疊去重兩個欄位: [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
        }
    }
}
  • 說明
  1. 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"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
  • 說明
  1. 上面使用四層聚合,最後一層是求最大得時間戳的,
  2. 舉個例子:f1:中國 f2:北京 f3:昌平,
  3. ES中,多層聚合只能巢狀,而且在聚合後資料量很大的情況下,最好想別的辦法解決
  4. 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"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
  • 說明
  1. 上面使用四層聚合,最後一層是求最大得時間戳的,
  2. 舉個例子:f1:中國 f2:北京 f3:昌平,
  3. ES中,為了表示遞進關係只能巢狀聚合,在聚合後資料量很大的情況下,最好想別的辦法解決
  4. aggs是關鍵字aggerations得縮寫,ES都可以識別
  5. 聚合中還可以算 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"
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
}
  • 說明
  1. 對一個欄位進行聚合,但是,聚合之後 還需要用到別的欄位的資料
  2. 在第一個聚合中,寫入子聚合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
        }
      }
    }
  }
}
  • 說明
  1. 如上是對欄位f1進行乘2得運算
  2. 如上可以是哦嫩滾params設定引數。

在更新Payload中寫邏輯運算: [script]

POST/GET your_server_ip:9200/index_name/_update_by_query

  • Payload
{
    "script": {
        "source": "ctx._source.state='Down'"
    }
}
  • 說明
  1. 如上是對欄位state進行更新,更新成Down資料
  2. 關於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"
                    }
                }
            ]
        }
    }
}
  • 說明
  1. 如上是按照查詢條件查詢到資料,並將所有查詢到資料得state更新為Down

依據查詢條件進行刪除

POST/GET your_server_ip:9200/index_name/_delete_by_query

  • Payload
{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "f1": "1"
                    }
                },
                {
                    "term": {
                        "f2": "2"
                    }
                }
            ]
        }
    }
}
  • 說明
  1. 如上是按照查詢條件查詢到資料,並將所有查詢到資料刪除掉。
  2. 如果想清空資料表可以傳入matchall得匹配{"query": {"match_all": {}}}或者在url中加入引數?q=*:*
  3. 這個操作不會刪除掉index

簡單得分頁查詢:[from size]

POST your_server_ip:9200/index_name/_delete_by_query

  • Payload
{
    "from":1,
    "size":10
}
  • 說明
  1. 如上是從第一個資料開始,查詢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=="
}
  • 說明
  1. 第一個查詢,會得到一個scroll_id
  2. 10m代表,當前scroll_id有效時間是10分鐘
  3. 第二個查詢,拿到這個scrolll_id之後,一隻訪問_search/scrollAPI,知道獲取到當前index得所有資料為止

多條插入資料:[_bulk]

POST your_server_ip:9200/_bulk

  • Payload
{ "index" : { "_index" : "test" } }
{"state":"111"}
{ "index" : { "_index" : "test", "_id" : "4" } }
{"state":"222"}
  • 說明
  1. bulk插入時,不需要再url中寫入index只需要再payload中傳入即可。
  2. 注意一行得空行,時必須得,ES會檢查出錯誤
  3. 提醒一下,再使用Python或者Java傳送http請求時,需要再每一行中都嚴格插入\n否則bulkAPI會失敗
  4. _id可傳,可不傳,如果不傳入,ES會自動生成一個。
  5. bulk中插入index中沒有得欄位也是被允許得。
  6. bulkAPI不會檢測index是否存在,即便不存在得index也可以正常插入。
  7. 關於bulk得效率問題,經過測試每次10000 每次15000 每次20000效率最高得時每次15000

  8. 上面提到過為了提高bulk得效率,最好設定refresh_interval大一點,30秒左右。
  9. bulk中是可以做,增、刪、改、插,四個操作的,每一個都是單獨的。

重新索引:[reindex]

POST your_server_ip:9200/_reindex

  • Payload
{
  "source": {
    "index": "old_index"
  },
  "dest": {
    "index": "new_index"
  }
}
  • 說明
  1. 上面說過,當一個index被建立,欄位得型別是不允許更改得,這個時候可以用reindex來遷移資料。

檢視所有index:[_cat/indices/]

POST your_server_ip:9200/_cat/indices/

  • 說明
  1. 每一列得意義
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
    }
}
  • 說明
  1. 可以叢集設定。
  2. max_buckets此處設定,只要是ES中聚合aggregationsbuckets數量預設是有限制的。
  3. max_open_scroll_context,對對能夠開啟的scroll查詢的個數

刪除所有生成的Scroll

DELETE http://10.75.44.100:9200/_search/scroll/_all

  • 說明
  1. 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
    }
}
  • 說明
  1. 如上是upsert。如果document_id存在,就將counter更新為4,不存在,則插入資料1,很實用。

提高 ES效率

  1. 關閉source:經測試不能關閉,關閉只是在當前欄位為查詢條件得情況下,關閉後可以提高某查詢效率查到id後去mysql中查詢具體資料,關閉後的欄位將不能被查詢出來使用。

  2. 開啟最佳壓縮(未設定)

  3. 設定延遲重新整理