写点什么

elk 简介与背景

作者:小黄鸡1992
  • 2021 年 12 月 03 日
  • 本文字数:3353 字

    阅读完需:约 11 分钟

elk简介与背景

下文将简介本专栏会涉及的概念,大多会一笔带过。如果有详细了解的需求,请自行查找。

一.背景

在项目落地之后,总有客户因为错误操作造成数据问题,但是总是提出是系统问题,所以决定做一个日志模块,能准确打印出用户操作的所有日志,但是 1.0 系统的实践后,会发现在经过一段时间的系统运行后,由于日志太大,会造成查询卡顿等情况。经过调研后决定使用 elk 日志收集。

二.elk 介绍

e 指的是 elasticsearch,为一种实时搜索和分析引擎(类似 nosql)。l 指的是 logstash,主要负责日志的采集,并传输到 elasticsearch。k 指的是 kibana,主要是可视化界面,用于操作 elasticsearch。

三.elasticsearch 简介

elasticsearch 是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在 Elasticsearch 中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。


elasticsearch 比传统关系型数据库如下:

Relational DB -> Databases -> Tables -> Rows -> ColumnsElasticsearch -> Indices   -> Types  -> Documents -> Fields举个栗子es---->index--->type---->docments--->filedmysql--->数据库---->表---->一条一条的数据--->表的列
复制代码

四.什么是倒排索引

elasticsearch 核心就是倒排索引,那什么是倒排索引呢?


正排索引:传入 id,查询出当前 id 所对应的数据。倒排索引:传入是单词,查询包含此单词数据的 id。例如:传入电视,elasticsearch 会查询包含电视数据的 id 并返回。


所以 elasticsearch 相对于传统数据库,更适合于查询。

五.分词器

1.什么是分词?

在一段数据存入时,会按照一定规律切分一段一段的单词,为下文的倒排索引查询做准备。例如,"冰箱彩电洗衣机"可能会被分成冰箱、彩电、洗衣机。这样在倒排索引中分别输入,就能获取数据的 id 了。

2.什么需要单独配置分词器

由于 elasticsearch 是老外研究的,所以默认的分词器只能识别英语,所以需要单独配置分词器。

3.装分词器之前

GET _analyze?pretty  {    "text": "Haier/海尔 BCD-470WDPG十字对开门风冷变频一级节能家用官方冰箱"  }
复制代码

结果如下:

{  "tokens" : [    {      "token" : "haier",      "start_offset" : 0,      "end_offset" : 5,      "type" : "<ALPHANUM>",      "position" : 0    },    {      "token" : "海",      "start_offset" : 6,      "end_offset" : 7,      "type" : "<IDEOGRAPHIC>",      "position" : 1    },    {      "token" : "尔",      "start_offset" : 7,      "end_offset" : 8,      "type" : "<IDEOGRAPHIC>",      "position" : 2    },      .      .      .      .    {      "token" : "冰",      "start_offset" : 37,      "end_offset" : 38,      "type" : "<IDEOGRAPHIC>",      "position" : 22    },    {      "token" : "箱",      "start_offset" : 38,      "end_offset" : 39,      "type" : "<IDEOGRAPHIC>",      "position" : 23    }  ]}
复制代码

会发现都是单个汉字。

4.装分词器后

GET _analyze?pretty  {    "analyzer": "ik_smart",    "text": "Haier/海尔 BCD-470WDPG十字对开门风冷变频一级节能家用官方冰箱"  }
复制代码

结果:

{  "tokens" : [    {      "token" : "haier",      "start_offset" : 0,      "end_offset" : 5,      "type" : "ENGLISH",      "position" : 0    },    {      "token" : "海尔",      "start_offset" : 6,      "end_offset" : 8,      "type" : "CN_WORD",      "position" : 1    },    {      "token" : "bcd-470wdpg",      "start_offset" : 9,      "end_offset" : 20,      "type" : "LETTER",      "position" : 2    },    {      "token" : "十字",      "start_offset" : 20,      "end_offset" : 22,      "type" : "CN_WORD",      "position" : 3    },    {      "token" : "对开",      "start_offset" : 22,      "end_offset" : 24,      "type" : "CN_WORD",      "position" : 4    },    {      "token" : "门",      "start_offset" : 24,      "end_offset" : 25,      "type" : "CN_CHAR",      "position" : 5    },    {      "token" : "风冷",      "start_offset" : 25,      "end_offset" : 27,      "type" : "CN_WORD",      "position" : 6    },    {      "token" : "变频",      "start_offset" : 27,      "end_offset" : 29,      "type" : "CN_WORD",      "position" : 7    },    {      "token" : "一级",      "start_offset" : 29,      "end_offset" : 31,      "type" : "CN_WORD",      "position" : 8    },    {      "token" : "节能",      "start_offset" : 31,      "end_offset" : 33,      "type" : "CN_WORD",      "position" : 9    },    {      "token" : "家用",      "start_offset" : 33,      "end_offset" : 35,      "type" : "CN_WORD",      "position" : 10    },    {      "token" : "官方",      "start_offset" : 35,      "end_offset" : 37,      "type" : "CN_WORD",      "position" : 11    },    {      "token" : "冰箱",      "start_offset" : 37,      "end_offset" : 39,      "type" : "CN_WORD",      "position" : 12    }  ]}
复制代码

看到这就不用多说了,符合我们想要结果。


上诉语句可以参考下文安装后,在 kibana 中自行测试。

六.简单语句总结

下文是 elasticsearch 比较常用且简单的语句,在下文安装后,在 kibana 中自行测试。

1.查询服务信息

GET /_cat/health?v   #查看集群健康状态GET /_cat/nodes?v    #查看节点状态GET /_cat/indices?v  #查看所有索引信息
复制代码

2.操作索引

PUT /test     #加入索引DELETE /test  #删除索引GET /test/_mapping  # 查看索引类型
复制代码

3.文档操作

PUT /aaa/doc/1{  "name": "John Doe"}#插入文档 参数:索引名称/文档类型/id
GET /aaa/doc/1 #通过id查看文档 POST /aaa/doc/1/_update{ "doc": { "name": "小李子" }}#修改索引中的文档
DELETE /aaa/doc/1 #删除索引中的文档
复制代码

4.数据脚本

这里提供一个 my_index 的索引供大家测试。

POST /my_index/_bulk{ "index": { "_id": 1 }}{ "title" : "Haier/海尔 BCD-470WDPG十字对开门风冷变频一级节能家用官方冰箱", "name" : "王二" , "age": 10, "created": 20190101 }{ "index": { "_id": 2 }}{ "title" : "【爆款秒杀】海尔冰箱三门家用小型节能省电双门电冰箱官方旗舰店", "name" : "王二" , "age": 10, "created": 20190101 }{ "index": { "_id": 3}}{ "title" : "Panasonic/松下 NR-TC28WS1-N 风冷无霜家用抑菌三门小体积冰箱", "name" : "王二" , "age": 10, "created": 20190101 }{ "index": { "_id": 4}}{ "title" : "小米电视4A50英寸4K高清智能网络平板液晶屏家电视机家电官方旗舰", "name" : "王二" , "age": 10, "created": 20190101 }{ "index": { "_id": 5}}{ "title" : "创维40X6 40英寸高清电视机智能网络wifi平板液晶屏家用彩电32 43", "name" : "王二" , "age": 10, "created": 20190101 }{ "index": { "_id": 6}}{ "title" : "Changhong/长虹 50D4P 50英寸超薄无边全面屏4K超高清智能电视机", "name" : "王二" , "age": 10, "created": 20190101 }
复制代码

5.查询索引

这里比较常用的就是查询索引,下文将介绍一下

1.查询所有数据

GET /my_index/_search{  "query": { "match_all": {} }}
复制代码

2.通过具体字段查询

GET /my_index/_search?pretty{    "query": {         "match": {"age": "10"}     }}
复制代码

3.通过查询并排序

GET /my_index/_search?pretty{    "query": {         "match": {"age": "10"},         "sort": { "age": { "order": "desc" } }     }}
复制代码

4.must(相当于 and)

GET /school/student/_search?pretty{    "query": {        "bool":{        "must":{"match": {"age": "10"}}}}}
复制代码

5.must_not (相当于 not)

GET /school/student/_search?pretty{    "query": {        "bool":{        "must_not":{"match": {"age": "10"}}}}}
复制代码


发布于: 2 小时前阅读数: 7
用户头像

小黄鸡1992

关注

小黄鸡加油 2021.07.13 加入

一位技术落地与应用的博主,带你从入门,了解和使用各项顶流开源项目。

评论

发布
暂无评论
elk简介与背景