docker安装单机es和kibana以及基础练习
docker安装单机es和kibana
1、拉取镜像
#镜像
sudo docker pull elasticsearch:7.4.2
#kibana
sudo docker pull kibana:7.4.2
2、启动容器
sudo docker run -di --name=es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.4.2sudo docker run -it -d -e ELASTICSEARCH_URL=http://10.108.113.211:9200 --name kibana -p 5601:5601 --privileged=true kibana:7.4.2
3、遇到问题
[Docker搭建kibana访问出现Kibana server is not ready yet]的问题
我们在访问 Kibana 的时候,有可能会出先 Kibana server is not ready yet
的问题 ,原因是因为 ELASTICSEARCH_URL
配置的应该是容器的 ip,而不是本地ip。
3.1查看es的网络ipAdress
sudo docker inspect es容器id
3.2 然后进入 Kibana 容器内部,修改 kibana.yml 中的ip
$ docker exec -it kibana容器id /bin/bash
$ cd config
$ vi kibana.ymlserver.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
3.3 只需要将上面的 "http://elasticsearch:9200"
中的 elasticsearch
替换成上一步的es容器内部ip就可以了。
3.4 修改完成之后退出容器,重新启动即可
es
参考自尚硅谷
1场景1 对明细搜索2 elk elasticsearch logstash kibana 3 olap (聚合效率有限) 但是 快速可视化 kibana 2 特点 天然分片 天然集群 shard 6.x 默认是一个index 5片, 1片不要超过30G 10G以下 建议分一个片 片数太多的 会明细影响性能天然索引 倒排索引 内容(分词) --> 主键lucene es 发动机与车 solr term index (快速定位分词) --> term dictionary (分词字典) --> posting list (分词对应的数据的id)3 cluster node shard index document field type4 dsl 插删改 es 本身不做物理修改 通过版本的提升 标记新版本 提升性能 目前不能查历史put 幂等post 非幂等查询全文匹配 (text)match 保存数据时要分词 组织成倒排索引 ,搜索的关键词要分词 拿分词依次去匹配倒排索引命中的数据 根据相关度评分 排序展示等值匹配 不分词(keyword)term 短语匹配 phrase_match 类似 like '%xxx%'模糊匹配fuzzy 字母容错混合查询 既有过滤 又有分词匹配post_filter 先分词匹配 再过滤bool 一边匹配一边过滤 范围过滤range 分页 from size排序 sort高亮highlight聚合 aggs 分组 terms 聚合 sum min max avg count(白送) stats(聚合全家桶)
es基础练习
GET _search
{"query": {"match_all": {}}
}
GET _cat/health
#查询各个节点状态
GET _cat/nodes?v
#查询各个索引状态
GET /_cat/indices?v
#查询某个索引的分片情况
GET /_cat/shards/users?v#Restful风格 get put post delete
## put 幂等性操作
## post 非幂等性操作
##PUT和DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有什么不同,DELETE也是一样。POST操作不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建了若干的资源。
##POST理解为新增,PUT理解为更新。因此,在curl -XPUT 中需要指定id。而POST的话,ES会自动创建id
##PUT会将新的json值完全替换掉旧的;而POST方式只会更新相同字段的值,其他数据不会改变,新提交的字段若不存在则增加
PUT users/_doc/1
{"user" : "Jack2","post_date" : "2019-05-15T14:12:12","message" : "trying out Elasticsearch"
}PUT /movie_index/movie/1
{ "id":1,"name":"operation red sea","doubanScore":8.5,"actorList":[
{"id":1,"name":"zhang yi"},
{"id":2,"name":"hai qing"},
{"id":3,"name":"zhang han yu"}
]
}
PUT /movie_index/movie/2
{"id":2,"name":"operation meigong river","doubanScore":8.0,"actorList":[
{"id":3,"name":"zhang han yu"}
]
}PUT /movie_index/movie/3
{"id":3,"name":"incident red sea","doubanScore":5.0,"actorList":[
{"id":4,"name":"zhang chen"}
]
}
#update 整体替换,和新增没有区别 要求:必须包括全部字段
PUT /movie_index/movie/3
{"id":"3","name":"incident red sea","doubanScore":"2.0","actorList":[
{"id":"1","name":"zhang chen"}
]
}
#修改—某个字段
POST movie_index/movie/3/_update
{ "doc": {"doubanScore":"7.0"}
}#### ES 是不删除也不修改任何数据的,而是增加版本号
DELETE /movie_index
DELETE /movie_index/movie/3################## 3.查询 #################搜索type全部数据
GET movie_index/_search#查询,根据id查询
GET movie_index/movie/3###### 3.1按条件查询 ######
#3.1.1全部查询
GET movie_index/_search
{"query": {"match_all": {}}}
#3.1.2按分词查询
GET movie_index/_search
{"query": {"match": {"name": "operation red sea"}}}#倒排索引
operation
red
seaoperation 1,2
red 1,3
sea 1,3
meigong 2
river 2
incident 31,2 1,3 1,3#3.1.3按分词子属性查询#match 分词匹配,必须用text字段
## text 类型事专用的分词字段,keyword不是分词字段
GET movie_index/_search
{"query": {"match": {"actorList.name": "zhang han yu"}}}
#term 值等匹配,必须用keyword字段
GET movie_index/_search
{"query": {"term": {"actorList.name.keyword": "zhang han yu"}}
}
}#3.1.4短语匹配,类似于like ‘%xxxx%’
GET movie_index/movie/_search
{"query":{"match_phrase": {"name":"operation red"}}
}
#3.1.5模糊匹配(容错匹配)
#校正匹配分词,当一个单词都无法准确匹配,es通过一种算法对非常接近的单词也给与一定的评分,能够查询出来,但是消耗更多的性能。
GET movie_index/movie/_search
{"query":{"fuzzy": {"name":"operator"}}
}###### 混和 1 先匹配 再过滤 GET movie_index/movie/_search
{"query":{"match": {"name":"red"}},"post_filter":{"term": {"actorList.id": 3}}
}GET movie_index/movie/_search
{"query":{"match":{"name":"red"}},"post_filter":{"term":{"actorList.name.keyword":"zhang han yu"}}}###### 混和 2 同时匹配+过滤
GET movie_index/movie/_search
{"query":{"bool":{"must":[{"match":{"name":"red"} },{"match":{"id":1}}],"filter":{"term":{"actorList.name.keyword":"zhang han yu"}}}}}###过滤--按范围过滤
GET movie_index/movie/_search
{"query":{"range":{"doubanScore":{"gte":6,"lte":9}}}}
### 排序
#"order":"desc"
#"order":"asc"
GET movie_index/movie/_search
{"query":{"range":{"doubanScore":{"gte":6,"lte":9}}},"sort":{"doubanScore":{"order":"asc"}}}#分页查询
#from 从第几行开始,size每页的大小
GET movie_index/movie/_search
{"query": { "match_all": {} },"from": 1,"size": 1
}#指定查询的字段
GET movie_index/movie/_search
{"query": { "match_all": {} },"_source": ["name", "doubanScore"]
}#### 聚合
#keyword 是某个字符串字段,专门储存不分词格式的副本 ,在某些场景中只允许只用不分词的格式,比如过滤filter 比如 聚合aggs, 所以字段要加上.keyword的后缀
#取出每个演员共参演了多少部电影
GET movie_index/movie/_search
{ "aggs": {"groupby_actor": {"terms": {"field": "actorList.name.keyword" }}}
}#每个演员参演电影的平均分是多少,并按评分排序
GET movie_index/movie/_search
{ "aggs": {"groupby_actor_id": {"terms": {"field": "actorList.name.keyword" ,"order": {"avg_score": "desc"}},"aggs": {"avg_score":{"avg": {"field": "doubanScore" }}}} }
}#"analyzer": "ik_smart"
GET _analyze
{"analyzer": "ik_max_word", "text":"红海行动"
}
#查看mapping
#但是如果没有设定mapping系统会自动,根据一条数据的格式来推断出应该的数据格式
#默认只有text会进行分词,keyword是不会分词的字符串。
#mapping除了自动定义,还可以手动定义,但是只能对新加的、没有数据的字段进行定义。一旦有了数据就无法再做修改了GET movie_index/_mapping/#基于中文分词搭建索引
PUT movie_chn
{"mappings": {"properties": {"id":{"type": "long"},"name":{"type": "text", "analyzer": "ik_smart"},"doubanScore":{"type": "double"},"actorList":{"properties": {"id":{"type":"long"},"name":{"type":"keyword"}}}}}}GET movie_chn/_mapping/
GET movie_chn/_search
DELETE movie_chn
PUT movie_chn/_doc/1
{ "id":1,"name":"红海行动","doubanScore":8.5,"actorList":[ {"id":1,"name":"张译"},{"id":2,"name":"海清"},{"id":3,"name":"张涵予"}]
}
PUT /movie_chn/_doc/2
{"id":2,"name":"湄公河行动","doubanScore":8.0,"actorList":[
{"id":3,"name":"张涵予"}
]
}PUT movie_chn/_doc/3
{"id":3,"name":"红海事件","doubanScore":5.0,"actorList":[
{"id":4,"name":"张晨"}
]
}GET /movie_chn/_doc/_search
{"query":{"match":{"name":"行动"}}
}######### 索引 ############
#索引别名就像一个快捷方式或软连接,可以指向一个或多个索引,也可以给任何一个需要索引名的API来使用。别名 带给我们极大的灵活性,允许我们做下面这些:
#1. 给多个索引分组 (例如, last_three_months)
#2. 给索引的一个子集创建视图
#3. 在运行的集群中可以无缝的从一个索引切换到另一个索引## 建表时直接声明
PUT movie_chn_2020
{ "aliases": {"movie_chn_2020-query": {}}, "mappings": {"properties": {"id":{"type": "long"},"name":{"type": "text", "analyzer": "ik_smart"},"doubanScore":{"type": "double"},"actorList":{"properties": {"id":{"type":"long"},"name":{"type":"keyword"}}}}}
}## 为已存在的索引增加别名
POST _aliases
{"actions": [{ "add": { "index": "movie_chn_2020", "alias": "movie_chn_2020-test" }}]
}GET movie_chn_2020-test/_search## 删除某个索引的别名
POST _aliases
{"actions": [{ "remove": { "index": "movie_chn_2020", "alias": "movie_chn_2020-query" }}]
}
## 查看别名列表
GET _cat/aliases?vPOST /_aliases
{"actions": [{ "remove": { "index": "movie_chn_2020", "alias": "movie_chn_2020-query" }},{ "add": { "index": "movie_chn", "alias": "movie_chn_2020-query" }}]
}GET movie_chn_2020-query/_search######### 索引模板 #########
#索引模板就是利用es 在没有索引的时候使用模板来建立索引
#注意 如果es中的shard特别多 有可能创建索引会变慢,如果延迟不能接受。建议别用模板而用定时脚本建立
#下面的索引模板的意思
#index_patterns,只要索引符合movie_test为前缀的索引,都是以该模板为标准构建
#"aliases,索引的别名,一个是movie_test-query,一个是"索引名+query"
#索引的作用
#movie_test-query 用来聚合统计,只要以movie_test开头的索引,都会被movie_test-query所查询到
PUT _template/template_movie2020
{"index_patterns": ["movie_test*"], "settings": { "number_of_shards": 1},"aliases" : { "{index}-query": {},"movie_test-query":{}},"mappings": { "properties": {"id": {"type": "keyword"},"movie_name": {"type": "text","analyzer": "ik_smart"}}}
}
#测试
POST movie_test_202001/_doc
{"id":"333","name":"zhang3"
}
POST movie_test_202002/_doc
{"id":"222","name":"li4"
}GET movie_test-query/_search#查看系统中已有的模板清单
GET _cat/templates
#查看某个模板详情
GET _template/template_movie2020