ELK

ELK

Kibana LogStash

es原理

下载

elasticsearch下载 kibana下载 logstash下载 分词器下载 pinyin下载

ES使用

控制面板 搜索 dev_tools或开发工具

分词器 pinyin

添加ik分词器

https://www.elastic.co/guide/cn/elasticsearch/guide/current/configuring-analyzers.html

下载解压在 elasticsearch/plugins/ik 
若版本不对则修改分词器的plugin-descriptor.properties中的elasticsearch.version=7.12.0

没安装分词器

image-20210329172352012

安装ik分词器

image-20210329172702821

自定义分词器

​ 新建 diy.dic ==> 我就是我

​ 修改 IKAnalyzer.cfg.xml ==> <entry key="ext_dict">diy.dic</entry>

image-20210331084808627 image-20210331084612096

pinyin安装

解压到es目录下的plugins下analysis-pinyin中即可,配置下plugin-descriptor.propertieselasticsearch.version版本

image-20210415101103830

ES与关系型数据库对应关系表

img

索引

索引index类似于MySQL 数据库的表,用来存储一系列具有相同数据结构的文档,其中mapping表示文档的存储结构,相当于MySQL中的表结构

#创建索引 ES中创建索引使用的是 PUT 请求
PUT /my_index
                {
                  "acknowledged" : true,
                  "shards_acknowledged" : true,
                  "index" : "my_index"
                }
#查询 ES 实例中现有的所有索引
GET _cat/indices
#查询新创建的索引
GET my_index
            {
              "my_index" : {
                "aliases" : { },
                "mappings" : { },
                "settings" : {
                  "index" : {
                    "routing" : {
                      "allocation" : {
                        "include" : {
                          "_tier_preference" : "data_content"
                        }
                      }
                    },
                    "number_of_shards" : "1",
                    "provided_name" : "my_index",
                    "creation_date" : "1618446846344",
                    "number_of_replicas" : "1",
                    "uuid" : "-Wuw_ZYdTHmh67ugExGsJw",
                    "version" : {
                      "created" : "7120099"
                    }
                  }
                }
              }
            }
#删除索引
DELETE my_index
            {
              "acknowledged" : true
            }

文档

文档document是ES记录数据的基本工具,本质是一个json对象,就相当于关系型数据库MySQL中的一行数据,和MySQL的每行数据一样,每个文档都有一个唯一id表示

#创建文档 
指定 ID 创建文档,使用 PUT
PUT my_index/doc/1
{
  "username": "es",
  "password": 123
}
不指定 ID ,使用 POST
POST /my_index/doc
{
  "username": "es2",
  "password": 12
}
method url地址 描述
PUT localhost:9200/索引名称/类型名称/文档id 创建文档(指定文档id)
POST localhost:9200/索引名称/类型名称 创建文档(随机文档id)
POST localhost:9200/索引名称/类型名称/文档id/_update 修改文档
DELETE localhost:9200/索引名称/类型名称/文档id 删除文档
GET localhost:9200/索引名称/类型名称/文档id 查询文档通过文档id
POST localhost:9200/索引名称/类型名称/_search 查询所有数据

查询模式

# 添加两条文档
PUT my_index/doc/1
{
  "username": "es",
  "password": 123
}
PUT my_index/doc/2
{
  "username": "es elk",
  "password": 123
}

# 泛查询: 不指明字段,在所有字段中匹配
# 查询任意字段中包含 es 的所有文档
GET my_index/_search?q=es

# 指定字段查询: 查询 username 为 es 的文档
# 查询 username 中包含 es 的所有文档
GET my_index/_search?q=username:es

# term: 一个个的单词, 匹配任意即可。比如 New York,匹配到 New 或者 York 都可以查询成功
# 查询 username 中含有 es 或者 elk 的所有文档
GET my_index/_search?q=username:es elk

# phrase: 词语查询,要用双引号包含,“elk”, 比如精确匹配到 “elk” 才可以
GET my_index/_search?q=username:"elk"

布尔操作符与分组查询

URISearch 中使用括号和布尔操作符进行条件分组查询,ES 中的布尔查询操作符如下:
AND (&&), OR(||), NOT(!), +(must), -(must_not)
括号可以用来区分查询的优先级和范围。

AND OR NOT 必须大写
在 URI Search 中 + 会被解析为空格,所以需要使用 encode 后的结果: %2B

# username 中可以包含 es ,必须包含 elk
GET my_index/_search?q=username:(es +elk)
即 GET my_index/_search?q=username:(es %2Belk)

# username 中包含 es, 但必须不能包含 elk
GET my_index/_search?q=username:(es -elk)

# username 中同时包含 es 和 elk 
GET my_index/_search?q=username:(es AND elk)

# 括号用于限定,表示 username 中包含 es 或者 elk 的字段
# 如果不加括号就成了 username 中包含 es 或者其他所有字段中包含 elk 的字段的
GET my_index/_search?q=username:(es OR elk)

范围查询

# ES 提供了对数字和日志的范围区间查询

#区间写法 闭区间用 [] 开区间 {}
age:[1 TO 10] => 1<=age<=10
age:[1 TO 10} => 1<=age<10
age:[1 TO] =>    age>=1
age:[* TO 10] => age<=10

#算术符号写法
age:>=1 
age:(>=1 && <=10)

#给文档添加字段
PUT /my_index/_mapping
{
  "properties": {
    "age": {
      "type": "integer"
    }
  }
}
type字段类型可如下
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

案例
GET my_index/_search?q=username:(es) AND age:>5
GET my_index/_search?q=age:[1 TO 10]

通配符与正则表达式

? 代表一个字符  * 代表0个或多个
username:e?k
username:e*

GET my_index/_search?q=username:e?k
GET my_index/_search?q=username:e*
GET my_index/_search?q=username:/[N]?e.*/

如果熟悉正则表达式的话那么将会非常方便,但是也要注意通配符匹配和正则匹配效率较低,会占用更多的内存,因此不建议使用。 并且没有特殊需求的话千万不要将 * ? 等通配符写在最前面,不然会导致查询所有的文档,极大的影响性能

模糊与近似度查询


常用的查询选项

通过查询结果我们可以知道 match 的查询匹配条件相当于 or。即任意一个单词匹配上即可,我们可以通过 operator 指明其为 and 查询,必须匹配所有的单词才可以 match(全文检索) match_phrase(短语搜索)

# username 字段会 先被拆除,后建立倒排索引
GET my_index/_search
{
  "query":{
      "match":{ # 指定查询类型为 match
        # 查询 username 中有 es 和 elk 的文档
        "username": {
          "query": "es elk"
          "operator": "and"
        }
      }
  }
}

# 控制的最小单词匹配数
GET my_index/_search
{
  "query": {
    "match": {
      "username": {
        "query": "es elk",
        # 虽然是 or, 但是我们要求最小匹配数为 2,必须匹配到 es 和 elk 才可以成功,达到了 and 的效果。
        "minimum_should_match": 2
      }
    }
  }
}

# match_phrase 是另一种全文检索模式(短语搜索),与 match 模式不同的是:
# match_phrase对字段作检索,有顺序要求
# phrase search 要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配
# 允许有差异,可以通过 slop 指定
GET my_index/_search
{
  "query": {
    "match_phrase": {
      # match_phrase 对单词顺序有要求,下面的条件将无法查询到结果,使用 match 可以
      "username": {
        "query": "elk es"
      }
    }
  }
}

# 可以通过 slop 字段指明差异度,指明为2 表示可以有两处差异,下面的语句可以查询出上面创建的文档
GET my_index/_search
{
  "query": {
    "match_phrase": {
      # match_phrase 对单词顺序有要求,下面的条件将无法查询到结果,使用 match 可以
      "username": {
        "query": "elk es",
        "slop": 2
      }
    }
  }
}

GET my_index/_search
{
  "profile": true,
  "query": {
    "query_string": {
      # 指明查询字段,查询 username 和 password 字段中含有 alfred 或者 java 和 ruby 的文档
      "fields": ["username", "password"],
      "query": "es OR 123"
    }
  }
}

# 高亮查询
GET my_index/_search
{
  "query": {
    "match": {
      "username":"es2"
    }
  },
  "highlight": {
    "fields": {
      "username":{}
    }
  }
}

LogStash使用

任意目录创建一个conf后缀的文件

image-20210414180619637

bin目录执行

logstash  -f  E:\_Environmental\es\logstash-7.12.0\config\log_elk.conf

监控文件 如下

input {
    file {
        path => "E:/_Environmental/es/1.log"
        #设置多长时间扫描目录,发现新文件
        discover_interval => 1
        #设置多长时间检测文件是否修改
        stat_interval => 10
        sincedb_write_interval => 1
        start_position => "beginning"
        #设置新事件的标志
        delimiter => "\n"
    }
}
filter {
    
}
output {
    stdout {
        codec => rubydebug
    }
    elasticsearch {
        hosts => ["127.0.0.1:9200"]
        index => "test-file"
    }
}

监控端口 如下

input{
    tcp {
        mode => "server"
        host => "127.0.0.1" #我这里是本地
        port => "9999"  #开放这个端口进行采集            
        codec => json_lines # 编解码器 有的版本需要肚子安装
    }
}
output{
    elasticsearch{ #es地址
        hosts=>["127.0.0.1:9200"]
        # 在es里产生的index的名称
        index => "test-tcp"
    }
    stdout{codec => rubydebug}
}

pom文件

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.6</version>
</dependency>

web项目resources下 logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />

    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--logstash日志收集端口-->
        <destination>127.0.0.1:9999</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <root level="INFO">
        <appender-ref ref="LOGSTASH" />
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

日夜颠倒头发少 ,单纯好骗恋爱脑 ,会背九九乘法表 ,下雨只会往家跑 ,搭讪只会说你好 ---- 2050781802@qq.com

×

喜欢就点赞,疼爱就打赏

相册 说点什么