docker 部署使用 ELk

docker 部署使用 ELk

学习参考文章

基础 : 拉取镜像

1
2
3
docker pull elasticsearch:6.5.4
docker pull kibana:6.5.4
docker pull logstash:6.5.4

集成:ELK

1
2
3
4
5
6
7
8
9
10

下载相应的文件:
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.0/elasticsearch-analysis-ik-6.5.0.zip

解压到相应 compose文件根目录下:es-plugin/ik 下 : unzip ik.zip

docker-compose 文件对 Es 的文件夹的指定:

volumes:
- ./es-plugin/ik:/usr/share/elasticsearch/plugins/ik
  • compose 文件内容
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    version: '2'

    services:

    elasticsearch:
    image: "elasticsearch:${ELK_VERSION}"
    container_name: elasticsearch
    ports:
    - "9200:9200"
    - "9300:9300"
    environment:
    ES_JAVA_OPTS: "-Xmx1024m -Xms1024m"
    #command: ["bash", "-c", "echo 'discovery.type: single-node'>>/usr/share/elasticsearch/config/elasticsearch.yml; /usr/local/bin/docker-entrypoint.sh eswrapper"]
    command: ["bash", "-c", "/usr/local/bin/docker-entrypoint.sh eswrapper"]
    # Ik 分词器的安装
    volumes:
    - ./es-plugin/ik:/usr/share/elasticsearch/plugins/ik
    networks:
    - elk

    logstash:
    image: "logstash:${ELK_VERSION}"
    container_name: logstash
    volumes:
    - ./logstash/pipeline:/usr/share/logstash/pipeline:ro
    ports:
    - "5000:5000"
    environment:
    LS_JAVA_OPTS: "-Xmx256m -Xms256m"
    depends_on:
    - elasticsearch
    command: ["bash", "-c", "echo 'path.config: /usr/share/logstash/pipeline'>>/usr/share/logstash/config/logstash.yml; /usr/local/bin/docker-entrypoint"]
    networks:
    - elk

    kibana:
    image: "kibana:${ELK_VERSION}"
    container_name: kibana
    ports:
    - "5601:5601"
    depends_on:
    - elasticsearch
    networks:
    - elk

    networks:
    elk:
    driver: bridge

访问服务

1
2
1. 打开dev Tools
2. 在窗口进行查询 : GET /_search

IK 分词器是否安装成功,在 kibana 上执行操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

GET /_analyze
{
"analyzer": "ik_max_word",
"text":"你好,我是中国人"
}


返回的结果:
{
"tokens" : [
{
"token" : "你好",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "我",
"start_offset" : 3,
"end_offset" : 4,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "是",
"start_offset" : 4,
"end_offset" : 5,
"type" : "CN_CHAR",
"position" : 2
},
{
"token" : "中国人",
"start_offset" : 5,
"end_offset" : 8,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "中国",
"start_offset" : 5,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 4
},
{
"token" : "国人",
"start_offset" : 6,
"end_offset" : 8,
"type" : "CN_WORD",
"position" : 5
}
]
}

kibana 操作 Es 增删该查操作

概念

  • 类比:
1
2
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

kibana 对 es 增删改查

  • 查看集群健康信息
1
2
3
4
5
6
7

GET /_cat/health?v


Green(正常)
Yellow(正常,但是一些副本还没有分配)
Red(非正常)
  • 查看集群,索引,分片情况:
1
2

GET /_cat/indices?v&h=health,status,index
  • 查看查询全部内容
1
2

GET /_search
  • 增加一个 document 内容,格式 : POST /{index}/{type} 不加 id 则系统默认给出一个 id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

POST /db-1/tab-1
{
"cn-name":"赖豪达",
"en-name":"samlai",
"age":28,
"content":"我的简介操作...."
}


返回的结果:

{
"_index" : "db-1",
"_type" : "tab-1",
"_id" : "dZc56m8BVtcun_3JvbEQ",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}




or 自己指定一个 id :


POST /db-1/tab-1/1
{
"cn-name":"赖豪达",
"en-name":"samlai",
"age":28,
"content":"我的简介操作...."
}
  • 删除一个 document 内容: DELETE /{index}/{type}/{id}
1
2

DELETE db-1/tab-1/dJcs6m8BVtcun_3JbrGq
  • 修改的操作,分覆盖全部 与 修改某些字段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

1.

覆盖全部字段:

PUT /db-1/tab-1/2
{
"cn-name":"赖豪达0002 修改---",
"en-name":"samlai0002",
"age":28,
"content":"我的简介操作....0002"
}


2.

修改某些字段内容:

POST db-1/tab-1/1/_update
{
"doc": {
"en-name":"我的英文名字是:赖豪达"
}
}


返回结果:

{
"_index" : "db-1",
"_type" : "tab-1",
"_id" : "1",
"_version" : 2,
"result" : "noop",
"_shards" : {
"total" : 0,
"successful" : 0,
"failed" : 0
}
}
  • 查询一个 document 内容 : GET /{index}/{type}/{id}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1.

GET db-1/tab-1/dJcs6m8BVtcun_3JbrGq

返回结果:

{
"_index" : "db-1",
"_type" : "tab-1",
"_id" : "dZc56m8BVtcun_3JvbEQ",
"_version" : 1,
"found" : true,
"_source" : {
"cn-name" : "赖豪达",
"en-name" : "samlai",
"age" : 28,
"content" : "我的简介操作...."
}
}


2.

GET db-1/tab-1/dJcs6m8BVtcun_3JbrGq/_source

返回结果:

{
"cn-name" : "赖豪达",
"en-name" : "samlai",
"age" : 28,
"content" : "我的简介操作...."
}

Es 语法高亮查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

GET db-1/tab-1/_search
{
"query": {
"term": {
"cn-name": "0018"
}
},
"highlight": {
"fields": {
"cn-name": {
"pre_tags":["<mark>"],
"post_tags":["</mark>"]
}
}
}
}

返回结果:

{
"took" : 46,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 2.5389738,
"hits" : [
{
"_index" : "db-1",
"_type" : "tab-1",
"_id" : "18",
"_score" : 2.5389738,
"_source" : {
"cn-name" : "0018",
"en-name" : "java samlai18",
"age" : 28,
"content" : " 内容 -->18"
},
"highlight" : {
"cn-name" : [
"<mark>0018</mark>"
]
}
}
]
}
}

Es 查询分类 : query string search / query DSL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

第一种:类似搜索全部商品: GET /ecommerce/product/_search (参数直接拼接在请求上,不带json参数的)

      query string search的由来,因为search参数都是以http请求的query string来附带的。

      搜索商品名称中包含yagao的商品,而且按照售价降序排列:

         GET /ecommerce/product/_search?q=name:yagao&sort=price:desc

      适用于临时的在命令行使用一些工具,比如curl,快速的发出请求,来检索想要的信息;但是

      如果查询请求很复杂,是很难去构建的,所以在生产环境中,几乎很少使用query string search。

  第二种:DSL:Domain Specified Language,特定领域的语言

      http request body:请求体,可以用json的格式来构建查询语法,比较方便,可以构建各种复杂的语法,

      比query string search肯定强大太多了。

full-text search 全文检索 | phrase search 短语搜索

1
2
3
4
5
6

全文检索:
会将输入的搜索串拆解开来,去索引里面去一一匹配,只要能匹配任意一个拆解后的单词,就可以作为结果返回

短语搜索:
要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配成功,才能作为结果返回
  • 多条件查询中的字段描述
1
2
3
4
5
6
7
8
9
10
11


must:  表示一定要满足;

  should:  表示可以满足也可以不满足;

  must_not:  表示不能满足该条件;

  minimum_should_match:1 :表示最小匹配度,可以设置为百分之百,设置了这个值的时候就必须满足should里面的设置了,

    另外注意这边should里面同一字段设置的多个值,意思是当这个值等于X或者等于Y都成立,务必注意格式。

Es批量的操作

  • 针对批量插入的限制: 一般建议是1000-5000个文档,大小建议是5-15MB,默认不能超过100M,可以在es的配置文件(即$ES_HOME下的config下的elasticsearch.yml)中
  • 批量的查询(kibana操作)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GET /_mget
{
"docs":
[
{
"_index" : "db-1",
"_type" : "tab-1",
"_id" : "1"
},
{
"_index" : "db-1",
"_type" : "tab-1",
"_id" : "2"
}
]
}
  • 批量查询 id 的集合的数据:
1
2
3
4
GET db-1/tab-1/_mget
{
"ids":["1","2","3"]
}
  • 批量的增加: _bulk:
1
2
3
4
5
6
7
8
9
POST /db-1/tab-1/_bulk
{"index":{"_id":1}}
{"title":"Java","price":55}
{"index":{"_id":2}}
{"title":"Html5","price":45}
{"index":{"_id":3}}
{"title":"Php","price":35}
{"index":{"_id":4}}
{"title":"Python","price":50}

Es 核心的操作还是查询操作: 使用query DSL 请求查询

  • match 分页查询:
1
2
3
4
5
6
7
8
GET db-1/tab-1/_search
{
"query": {
"match_all" : {}
},
"from": 0,
"size": 1
}
  • 根据字段 age 的倒序的查询:
1
2
3
4
5
6
7
8
9
10
11
GET db-1/tab-1/_search
{
"query": {
"match_all" : {}
},
"sort": [
{
"age": "desc"
}
]
}
  • 指定查询项 : 只查询出 content 的字段内容:
1
2
3
4
5
6
7
8
9
GET db-1/tab-1/_search
{
"query": {
"match_all" : {}
},
"_source": "content",
"from": 0,
"size": 1
}
  • matchAll 操作: 全查询 但显示仅仅是 5条记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32


GET db-1/tab-1/_search
{
"query": {
"match_all" : {}
}
}

返回结果: 5条记录

```


+ 过滤查询 : 匹配查询 cn-name = ELK

```text

GET db-1/tab-1/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"cn-name": "ELK"
}
}
]
}
}
}
  • 全文检索:
    1
    2
    3
    4
    5
    6
    7
    8
    GET db-1/tab-1/_search
    {
    "query": {
    "match": {
    "content": "97"
    }
    }
    }
  • 短语检索:
1
2
3
4
5
6
7
8
GET db-1/tab-1/_search
{
"query": {
"match_phrase": {
"content": " 内容 -->9"
}
}
}
  • 复合查询:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

GET db-1/tab-1/_search
{
"from": 10,
"size": 20,
"sort": [
{
"age": {
"order": "desc"
}
}
],
"query": {
"bool" : {
"must" : [
{
"match" : {
"content" : {
"query" : " 内容",
"operator" : "OR",
"prefix_length" : 0,
"max_expansions" : 50,
"fuzzy_transpositions" : true,
"lenient" : false,
"zero_terms_query" : "NONE",
"auto_generate_synonyms_phrase_query" : true,
"boost" : 1.0
}
}
}
],
"filter" : [
{
"range" : {
"age" : {
"from" : "5",
"to" : "25",
"include_lower" : true,
"include_upper" : true,
"boost" : 1.0
}
}
}
],
"must_not" : [
{
"term" : {
"age" : {
"value" : "90",
"boost" : 1.0
}
}
}
],
"should" : [
{
"range" : {
"age" : {
"from" : "10",
"to" : "20",
"include_lower" : true,
"include_upper" : true,
"boost" : 1.0
}
}
}
],
"adjust_pure_negative" : true,
"boost" : 1.0
}
}
}
感谢您的阅读,本文由 左之右 版权所有。如若转载,请注明出处:左之右(https://zuoyoulai.github.io/2020/01/27/elk/
mybatis-batch 批处理
xxx-job 分布式定时任务系统