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.2
sudo 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.yml
server.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 type
4 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
sea
operation 1,2
red 1,3
sea 1,3
meigong 2
river 2
incident 3
1,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?v
POST /_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