• ElasticSearch 安装与API的使用


    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请求时,需要再每一行中都严格插入 否则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. 设置延迟刷新

    补充

    修改于20191128
    当你的ES查询URL中又特殊的字符的时候请用以下的代替

    空格    -    %20
    "          -    %22
    #         -    %23
    %        -    %25
    &         -    %26
    (          -    %28
    )          -    %29
    +         -    %2B
    ,          -    %2C
    /          -    %2F
    :          -    %3A
    ;          -    %3B
    <         -    %3C
    =         -    %3D
    >         -    %3E
    ?         -    %3F
    @       -    %40
              -    %5C
    |          -    %7C 
    
  • 相关阅读:
    Docker(五)-Dcoker容器
    Docker(二)-Docker安装
    Docker(四)-Dcoker镜像
    Docker(三)-Docker中Image、Container与Volume的迁移
    Docker(一)-Docker介绍
    coredump分析
    linux下生成core dump文件方法
    软件测试流程清单
    软件测试风险清单
    [测试管理]测试周报该如何写
  • 原文地址:https://www.cnblogs.com/primadonna/p/11358440.html
Copyright © 2020-2023  润新知