老男孩ELK教程06 ElasticSearch的Restful风格API实战

Restful及JSON格式

数据类型 描述 举例
字符串 要求使用双引号("")引起来的数据 "oldboyedu"
数字 通常指的是0-9的所有数字 100
布尔值 只有true和false两个值 true
空值 只有null一个值 null
数组 使用一对中括号("[]")放入不同的元素(支持高级数据类型和基础数据类型) ["linux",100,false]
对象 使用一对大括号S#ef#T扩起来,里面的数据使用KEY-VALUE键值对即可 ["class":"linux80","age":25]
Restful⻛格程序: RESTFUL是一种网络应用程序的设计⻛格和开发方式,基于HTTP,可以使用XML格式定义或
JSON格式定义。
REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序。REST首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。
JSON语法: 基础数据类型:
字符串: "oldboyedu" "老男孩IT教育" "2022" ""
数字: 0  1 2 ...
布尔值: true false
空值: null
高级数据类型: 
数组:["oldboyedu","沙河",2022,null,true, {"school":"oldboyedu","class":"linux80"}]
对象:{"name":"oldboy", "age":40, "address":"北京沙河", "hobby":["Linux","思想课"],"other":null}
课堂练习: 使用json格式记录你的名字(name),年龄(age),学校(school),爱好(hobby),地址 (address)。

ElasticSearch 相关术语

Document: 即文档,是用户存储在ES的一些数据,它是ES中最小的存储单元。换句话说,一个文档是不可被拆分的。 一个文档使用的是json的对象数据类型存储。
filed: 相当于数据库表的字段,对文档数据根据不同属性进行分类标示。
index: 即索引,一个索引就是一个拥有相似特征文档的集合。
shard: 即分片,是真正存储数据的地方,每个分片底层对应的是一个Lucene库。一个索引至少有1
个或多个分片。
replica: 即副本,是对数据的备份,一个分片可以有0个或多个副本。 一旦副本数量不为0,就会引入主分片(primary shard)和副本分片(replica shard)的
概念。
主分片(primary shard): 可以实现数据的读写操作。 
副本分片(replica shard): 可以实现数据读操作,与此同时,需要去主分片同步数据,当主分片挂掉,副本分片会变为主分片。
Allocation:
即分配,将分片(shard)分配给某个节点的过程,包括主分片和副本分片。 如果是副本分片,还包含从主分片复制数据的过程,这个分配过程由master节点调度完成。
Type: 在es 5.x即更早的版本,在一个索引中,我们可以定义一种或多种数据类型。但在es7仅支
持"_doc"类型。

管理索引的API

查看索引信息

GET http://192.168.8.21:9200/_cat/indices # 查看全部的索引信息 
GET http://192.168.8.21:9200/_cat/indices?v  # 查看表头信息
GET http://192.168.8.21:9200/_cat/indices/.kibana_7.17.3_001?v  # 查看单个 索引
GET http://192.168.8.21:9200/.kibana_7.17.3_001   # 查看单个索引的详细信息

创建索引信息

 PUT http://192.168.8.21:9200/oldboyedu-linux82 
# 创建索引并指定分片和副本
 {
    "settings": {
        "index": {
              "number_of_shards": "3",
              "number_of_replicas": 0
       } 
    }
}


参数说明: 
"number_of_shards": 指定分片数量: 
"number_of_replicas": 指定副本数量。

修改索引

PUT /oldboyedu-linux82/_settings
{
  "number_of_replicas": 1
}
温馨提示: 分片数量无法修改,副本数量是可以修改的。

删除索引


DELETE http://192.168.8.21:9200/oldboyedu-linux80
温馨提示: 删除索引,服务器的数据也会随之删除哟!

索引别名

POST  _aliases
{
  "actions": [
    {
      "add": {
        "index": "oldboyedu-linux82",
        "alias": "Linux容器运维"
      }
    },
    {
      "add": {
        "index": "oldboyedu-linux82",
        "alias": "DBA"
      }
    }
  ]
}

POST  _aliases
{
  "actions": [
    {
      "remove": {
        "index": "oldboyedu-linux82",
        "alias": "Linux容器运维"
      }
    },
    {
      "add": {
        "index": "oldboyedu-linux82",
        "alias": "DBA-2"
      }
    }
  ]
}

关闭索引

POST http://10.0.0.101:9200/oldboyedu-linux80/_close   # 关闭索引 
POST http://10.0.0.101:9200/oldboyedu-*/_close   # 基于通配符关闭索引
温馨提示: 索引关闭意味着该索引无法进行任何的读写操作,但数据并不会被删除。

打开索引

POST http://10.0.0.101:9200/oldboyedu-linux80/_open # 打开索引 

POST http://10.0.0.101:9200/oldboyedu-*/_open # 基于通配符打开索引

索引的其他操作

参考文档

管理文档的API

文档的创建



POST teacher/_doc    # 不带id,自动生成id
  {
    "name": "oldboy",
    "hobby": ["Linux","思想课" ]
  }
  
 POST teacher/_doc/1001    #指定id
  {
    "name": "oldboy",
    "hobby": ["Linux2","政治课" ]
  }



文档查看

GET teacher/_search/
  
GET teacher/_doc/1001

HEAD teacher/_doc/1002

文档修改

 POST teacher/_doc/1001  # 全量更新
  {
    "name": "oldboy",
    "hobby": ["Linux8","语文课" ]
  }

 POST teacher/_doc/1001/_update   # 局部更新
  {
    "doc":{
    "name": "lifei"
    }
  }

文档删除

DELETE http://10.0.0.101:9200/teacher/_doc/1001

文档的批量操作

 POST http://10.0.0.101:9200/_bulk # 批量创建
{ "create": { "_index": "oldboyedu-linux80-elk"} }{ "name": "oldboy","hobby":["Linux","思想课"] }
{ "create": { "_index": "oldboyedu-linux80-elk","_id": 1002} } { "name": "振亚","hobby":["妹子","吃面"] }
{ "create": { "_index": "oldboyedu-linux80-elk","_id": 1001} } { "name": "苍老师","hobby":["家庭主妇"] }
POST http://10.0.0.101:9200/_bulk # 批量删除
{ "delete" : { "_index" : "oldboyedu-linux80-elk", "_id" : "1001" } } { "delete" : { "_index" : "oldboyedu-linux80-elk", "_id" : "1002" } }
POST http://10.0.0.101:9200/_bulk # 批量修改
{ "update" : {"_id" : "1001", "_index" : "oldboyedu-linux80-elk"} } { "doc" : {"name" : "CangLaoShi"} }
{ "update" : {"_id" : "1002", "_index" : "oldboyedu-linux80-elk"} } { "doc" : {"name" : "ZhenYa"} }
POST http://10.0.0.101:9200/_mget # 批量查看 {
"docs": [ {
      "_index": "oldboyedu-linux80-elk",
      "_id": "1001"
    },
    {
      "_index": "oldboyedu-linux80-elk",
      "_id": "1002"
} ]
}

温馨提示: 对于文档的批量写操作,需要使用"_bulk"的API,而对于批量的读操作,需要使
用"_mget"的API。
参考链接: 
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docs-bulk.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docs-multi-get.html


使用映射(mapping)自定义数据类型

映射的数据类型

 当写入文档时,字段的数据类型会被ES动态自动创建,但有的时候动态创建的类型并符合我们的需 求。这个时候就可以使用映射解决。
使用映射技术,可以对ES文档的字段类型提前定义我们期望的数据类型,便于后期的处理和搜索。 text:
     全文检索,可以被全文匹配,即该字段是可以被拆分的。
keyword:
     精确匹配,必须和内容完全匹配,才能被查询出来。
ip:
支持Ipv4和Ipv6,将来可以对该字段类型进行IP地址范围搜索。
参考链接: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/mapping.htm
l
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/mapping-
types.html

IP案例

PUT http://10.0.0.101:9200/oldboyedu-linux80-elk # 创建索引时指定映射关系 
{
    "mappings" :{
        "properties": {
            "ip_addr" : {
                "type": "ip"

}}}}
GET http://10.0.0.101:9200/oldboyedu-linux80-elk # 查看索引的映射关系
POST http://10.0.0.101:9200/_bulk # 创建测试数据
{ "create": { "_index": "oldboyedu-linux80-elk"} } { "ip_addr": "192.168.10.101" }
{ "create": { "_index": "oldboyedu-linux80-elk"} } { "ip_addr": "192.168.10.201" }
{ "create": { "_index": "oldboyedu-linux80-elk"} } { "ip_addr": "172.31.10.100" }
{ "create": { "_index": "oldboyedu-linux80-elk"} } { "ip_addr": "10.0.0.222" }
GET http://10.0.0.101:9200/oldboyedu-linux80-elk/_search # 查看IP的网断 
{
    "query": {
        "match" : {
} }}

其他数据类型案例

PUT http://10.0.0.101:9200/oldboyedu-linux80-elk-2022 # 创建索引 GET http://10.0.0.101:9200/oldboyedu-linux80-elk-2022 # 查看索引信息
PUT http://10.0.0.101:9200/oldboyedu-linux80-elk-2022/_mapping # 为已创 建的索引修改数据类型
{
    "properties": {
        "name": {
            "type": "text",
            "index": true
        },
        "gender": {
            "type": "keyword",
            "index": true
        },
        "telephone": {
            "type": "text",
            "index": false
        },
        "address": {
            "type": "keyword",
            "index": false
}, 
          "email": {
            "type": "keyword"
        },
        "ip_addr": {
            "type": "ip"
} }
}
POST http://10.0.0.101:9200/_bulk # 添加测试数据
{ "create": { "_index": "oldboyedu-linux80-elk-2022"} } { "ip_addr": "192.168.10.101" ,"name": "柳鹏","gender":"男性 的","telephone":"33333333","address":"沙 河","email":"liupeng@oldboyedu.com"}
{ "create": { "_index": "oldboyedu-linux80-elk-2022"} } { "ip_addr": "192.168.20.21" ,"name": "王岩","gender":"男性 的","telephone":"55555","address":"松兰 堡","email":"wangyan@oldboyedu.com"}
{ "create": { "_index": "oldboyedu-linux80-elk-2022"} } { "ip_addr": "172.28.30.101" ,"name": "赵嘉欣","gender":"女性 的","telephone":"33333333","address":"于辛 庄","email":"zhaojiaxin@oldboyedu.com"}
{ "create": { "_index": "oldboyedu-linux80-elk-2022"} } { "ip_addr": "172.28.50.121" ,"name": "庞冉","gender":"女性 的","telephone":"444444444","address":"于辛 庄","email":"pangran@oldboyedu.com"}
{ "create": { "_index": "oldboyedu-linux80-elk-2022"} } { "ip_addr": "10.0.0.67" ,"name": "王浩任","gender":"男性 的","telephone":"22222222","address":"松兰 堡","email":"wanghaoren@oldboyedu.com"}


GET http://10.0.0.101:9200/oldboyedu-linux80-elk-2022/_search # 基于 gender字段搜索
{
    "query":{
        "match":{
            "gender": "女" }
} }
GET http://10.0.0.101:9200/oldboyedu-linux80-elk-2022/_search # 基于 name字段搜索
{
    "query":{
        "match":{
"name": "王" }
} }
GET http://10.0.0.101:9200/oldboyedu-linux80-elk-2022/_search # 基于 email字段搜索
{
    "query":{
        "match":{
            "email": "pangran@oldboyedu.com"
        }
} }
GET http://10.0.0.101:9200/oldboyedu-linux80-elk-2022/_search # 基于 ip_addr字段搜索
{
    "query": {
        "match" : {
            "ip_addr": "192.168.0.0/16"
        }
} }
GET http://10.0.0.101:9200/oldboyedu-linux80-elk-2022/_search # 基于 address字段搜索,无法完成。
{
    "query":{
        "match":{
              "address": "松兰堡"
}}}

安装IK分词器

下载地址: https://github.com/medcl/elasticsearch-analysis-ik
安装IK分词器:
install -d /lifei/soft/es/plugins/ik -o oldboyedu -g
oldboyed
    cd /lifei/soft/es/plugins/ik
    unzip elasticsearch-analysis-ik-7.17.3.zip
    rm -f elasticsearch-analysis-ik-7.17.3.zip
    chown -R oldboyedu:oldboyedu *
重启ES节点,使之加载插件: systemctl restart es
测试IK分词器:
GET http://10.0.0.101:9200/_analyze # 细粒度拆分 
{
"analyzer": "ik_max_word",    #拆分的数目多
"text": "我爱北京天安⻔!" 
}
GET http://10.0.0.101:9200/_analyze # 粗粒度拆分 
{
"analyzer": "ik_smart",
"text": "我爱北京天安⻔!" }

注:如果是rpm 包安装的elasticsearch的话,直接下载解压即可 

自定义词典分词器

(1)进入到IK分词器的插件安装目录
cd /lifei/soft/es/plugins/ik/config
(2)自定义字典
cat > lifei.dic <<'EOF'
上号
德玛⻄亚
艾欧尼亚
亚索
EOF
chown oldboyedu:oldboyedu oldboyedu-linux80.dic
(3)加载自定义字典
vim IKAnalyzer.cfg.xml
...
<entry key="ext_dict">lifei.dic</entry>
(4)重启ES集群 systemctl restart es
(5)测试分词器
GET http://10.0.0.101:9200/_analyze {
    "analyzer": "ik_smart",
"text": "嗨,哥们! 上号,我德玛⻄亚和艾欧尼亚都有号! 我亚索贼6,肯定能带你 ⻜!!!"
}

创建索引生命周期

PUT _ilm/policy/delete-after-20-days
{
  "policy": {
    "phases": {
      "delete": {
        "min_age": "20d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}


将索引模板应用到ilm策略

PUT _index_template/template-with-ilm
{
  "index_patterns": ["your-index-pattern-*"], 
  "template": {
    "settings": {
      "index": {
        "lifecycle": {
          "name": "delete-after-20-days",
          "rollover_alias": "your-alias" 
        }
      }
    }
  }
}

查看索引模板


GET _index_template/

GET bih_tha_flow-2024.12.24/_settings

创建索引模板

PUT _index_template/oih_tha_flow
{
        "index_patterns" : [
          "oih_tha_flow-*"
        ],
        "template" : {
          "settings" : {
            "index" : {
              "lifecycle" : {
                "name" : "delete-after-20-days"
              },
              "number_of_shards" : "6",
              "number_of_replicas" : "0"
            }
          },
          "mappings" : {
            "properties" : {
              "@timestamp" : {
                "type" : "date"
              },
              "flow" : {
                "properties" : {
                  "output" : {
                    "properties" : {
                      "snmp" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      }
                    }
                  },
                  "input" : {
                    "properties" : {
                      "snmp" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      }
                    }
                  },
                  "protocol" : {
                    "type" : "text",
                    "fields" : {
                      "keyword" : {
                        "ignore_above" : 256,
                        "type" : "keyword"
                      }
                    }
                  },
                  "dst" : {
                    "properties" : {
                      "as_org" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      },
                      "city_name" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      },
                      "port" : {
                        "type" : "long",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      },
                      "ip" : {
                        "type" : "ip",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      },
                      "country_name" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      },
                      "asn" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      }
                    }
                  },
                  "src" : {
                    "properties" : {
                      "as_org" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      },
                      "city_name" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      },
                      "port" : {
                        "type" : "long",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      },
                      "ip" : {
                        "type" : "ip",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      },
                      "country_name" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      },
                      "asn" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "ignore_above" : 256,
                            "type" : "keyword"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "composed_of" : [ ],
        "priority" : 1
      }

删除索引模板

DELETE _index_template/oih_tha_flow
posted @ 2023-03-31 15:43  lifei888  阅读(99)  评论(0)    收藏  举报