目录

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. 设置延迟刷新

补充

修改于20191128

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

空格    -    %20
" - %22
# - %23
% - %25
& - %26
( - %28
) - %29
+ - %2B
, - %2C
/ - %2F
: - %3A
; - %3B
< - %3C
= - %3D
> - %3E
? - %3F
@ - %40
\ - %5C
| - %7C

ElasticSearch 安装与使用的更多相关文章

  1. ElasticSearch安装及部署

    安装及部署 一.环境配置 操作系统:Cent OS 7ElasticSearch版本:1.3.2JDK版本:1.7.0_51SSH Secure Shell版本:XShell 5elasticsear ...

  2. Elasticsearch安装和使用

    Elasticsearch安装和使用 Elasticsearch 是开源搜索平台的新成员,实时数据分析的神器,发展迅猛,基于 Lucene.RESTful.分布式.面向云计算设计.实时搜索.全文搜索. ...

  3. Elasticsearch安装详解

    本文只介绍在windows上的安装和配置,其他安装和配置请参见官方文档 ES在windows上安装需下载zip安装包,解压后bin目录下有个 elasticsearch-service.bat 文件. ...

  4. Elasticsearch.安装插件(head)

    Elasticsearch.安装插件(head) 环境: Linux 7.x jdk1.8 目录结构(跟目录多了两个文件) /resources   ### 存放软件源 /u01/          ...

  5. Elasticsearch.安装(单节点)

    Elasticsearch.安装(单节点) 环境Linux 7.x jdk 1.8 elasticsearch 5.x 环境目录结构(根目录多了两个文件夹): /resources    /** 存放 ...

  6. ELK日志监控平台安装部署简介--Elasticsearch安装部署

    最近由于工作需要,需要搭建一个ELK日志监控平台,本次采用Filebeat(采集数据)+Elasticsearch(建立索引)+Kibana(展示)架构,实现日志搜索展示功能. 一.安装环境描述: 1 ...

  7. elasticsearch 安装,以及遇到的问题总结

    系统.软件环境: Centos 6.5 elasticsearch 6.1.1 elasticsearch 安装的话是很简单的,但是安装完成启动的时候报错,下面我就一一的来描述错误,并提供相应的解决方 ...

  8. elasticsearch 安装、配置

    elasticsearch:基于java开发,基于RESTful web 接口,提供分布式多用户能力的全文搜索引擎. elasticsearch 安装: 1. java SE Development ...

  9. 如何给Elasticsearch安装中文分词器IK

    安装Elasticsearch安装中文分词器IK的步骤: 1. 停止elasticsearch 2.2的服务 2. 在以下地址下载对应的elasticsearch-analysis-ik插件安装包(版 ...

  10. (转载)Centos下Elasticsearch安装详细教程

    原文地址:http://www.cnblogs.com/sunny1009/articles/7874251.html Centos下Elasticsearch安装详细教程 1.Elasticsear ...

随机推荐

  1. Java 垃圾收集总结

    概述 垃圾收集(Garbage Collection,GC),它不是Java语言的伴生产物,它的历史比Java还要久远. 人们主要思考GC需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何 ...

  2. [ZJOI2008]杀蚂蚁antbuster 题解

    一个题目的可读版本:https://www.zybuluo.com/Jerusalem/note/221811 这两天做的又一道大模拟题,感觉这玩意有毒,会上瘾啊…… 比起猪国杀这道题真心不知道高到哪 ...

  3. 跨站脚本攻击(存储型xss)笔记(二)

    测试目标字段:页面下方的红色框位置. 由于编辑状态是编辑器,所以有可能出现跨站! 我插了个input然而并没有当代码执行 可能有些测试人员就认为被过滤掉了,因为尝试了各种尖括号.js事件.转义.编码等 ...

  4. bs4——BeautifulSoup模块:解析网页

    解析由requests模块请求到的网页 import requests from bs4 import BeautifulSoup headers = {'User-Agent': 'Mozilla/ ...

  5. DataNode的工作机制

    DataNode的工作机制 一个数据块在DataNode以文件的形式在磁盘上保存,分为两个文件,一个是数据本身, 一个是元数据信息(包括数据的长度,校验和,时间戳) 1.DataNode启动后,向Na ...

  6. python字符编码-文件操作

    字符编码 字符编码历史及发展 为什么有字符编码 ''' 原因:人们想要将数据存入计算机 计算机的能存储的信息都是二进制的数据 内存是基于电工作的,而电信号只有高低频两种,就用01来表示高低电频,所以计 ...

  7. python面向对象-封装-property-接口-抽象-鸭子类型-03

    封装 什么是封装: # 将复杂的丑陋的隐私的细节隐藏到内部,对外提供简单的使用接口 或 # 对外隐藏内部实现细节,并提供访问的接口 为什么需要封装 1.为了保证关键数据的安全性 2.对外部隐藏内部的实 ...

  8. c++容器简单总结

    数据结构 描述 实现头文件 向量(vector) 连续存储的元素 <vector> 列表(list) 由节点组成的双向链表,每个结点包含着一个元素 <list> 双队列(deq ...

  9. 谈谈用Boox Max 2 阅读A4纸文献的体验

    首先说说选择Boox的几个原因: 护眼.这个不用多说,之所以除了电脑,还要电子阅读器,主要是为了护眼. 减少纸质书籍购买.纸质书籍拿在手上是有质感,读起来也更舒服,可一则一些外文书买纸质的是很贵的,相 ...

  10. Ubuntu启动Apache

    划重点:最重要的是找到一个文件--------startup.sh 如果你是按照百度上的方法下载的Apache2,那么就按照百度的方式来 但是异曲同工 如果你是自己在网上下载的Apache到的磁盘 找 ...