ELK实时日志分析平台
Elasticsearch 是一个搜索和分析引擎。
Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等存储库中。
Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。
安装教程
1.ES索引 (index)
按照索引存储,类似关系型数据库的一个数据库(database)比如test
可以创建很多个索引,名字必须唯一,名字必须全部是小写字母
2.类型(type)
一个索引可以创建任意多个类型(es6.0之前一个索引可以创建多个类型,es6.0还能兼容多5.0的多个类型,es7.0一个索引只支持创建一个类型) 用户类型,部门类型,员工类型
类似关系型数据库的表
3.映射(mapping)
和关系型数据库中的约束类似(schema),指定类型的长度,字段
4.文档(document)
存储json格式 比如 {"id":12,"name":"lisi","age":123}
以下demo基于ES7.16.2
全文检索
一.索引操作:
1.1 PUT 创建索引:
PUT /es_test
1.2 DELETE 删除索引
DELETE /es_test
1.3 GET 查看所有索引
GET /_cat/indices
1.4 类型操作
创建用户索引 id name age bir
PUT /es_test
{
"mappings": {
"properties": {
"id": {"type": "integer"},
"name": {"type": "text" },
"age": { "type": "integer" },
"bir": { "type": "date" },
"system_code": {
"type": "integer",
"index": false
}
}
}
}
1.5 添加一条数据 格式 POST 或者 PUT /_index/_type
1.5.1方式一 不指定id 自动生成
POST /es_test/_doc
{
"id":1,
"name":"zhangsan333",
"age":120,
"bir":"2021-10-10"
}
1.5.2方式二 指定id
PUT /es_test/_doc/6
{
"id":1,
"name":"zhangsan6666",
"age":14,
"bir":"2021-10-14"
}
1.6 查看索引的类型
GET /es_test/_mapping
1.7 获取值
GET /es_test/_doc/1
// 获取指定字段
GET /es_test/_doc/1 ?_source=age,name
// 只返回字段和值,其他信息不返回
GET /es_test/_doc/1/_source
1.8 删除文档的值
DELETE /es_test/_doc/7
1.9更新类型的值
1.9.1删除之前的类型值,并插入
POST /es_test/_doc/3IMPR34Bn3IkzFkShpCk
{
"name":"zhangsantest1"
}
1.9.2更新之前的类型值,不删除
POST /es_test/_doc/3IMPR34Bn3IkzFkShpCk/_update
{
"name":"zhangsantest1"
}
1.10批量操作
POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title": "My first blog post" }
{ "index": { "_index": "website", "_type": "blog" }}
{ "title": "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }
二.检索
2.1 QueryingString 查询参数 拼接参数 只适合简单的查询,url长度有限
GET /index/_search?
2.1.1 查询所有值
GET /es_test/_search?q=*
GET /es_test/_search?q=&sort=age 按照年龄排序
分页
from 从哪一条数据开始查查
size 显示条数
默认返回10条
GET /es_test/_search?q=&sort=age&size=30
2.2 QueryDSL 写请求体,传入json
2.2.1 查询所有 GET /index/_search
{
"query":{
"match_all":{}
},
}
2.2.2查询所有并排序
GET /es_test/_search
{
"query":{
"match_all":{}
},
"size":20,
"from":1,
"sort":[{
"age":{
"order":"desc"
}
}]
"_source":["name","age"]
}
2.2.3基于关键词查询
GET /es_test/_search
{
"query":{
"term": {
"name": {
"value": "海"
}
}
}
}
2.2.4范围过滤
GET /es_test/_search
{
"query": {
"range": {
"age": {
"gte": 10,
"lte": 20,
"boost": 2.0
}
}
}
}
2.2.5前缀查询
GET /es_test/_search
{
"query": {
"prefix": {
"name": {
"value": "zhang"
}
}
}
}
2.2.6通配符查询 wildcard
?匹配一个 匹配多个
"value": "zhang?"
"value": "zhang"
GET /es_test/_search
{
"query": {
"wildcard": {
"name": {
"value": "zhang?"
}
}
}
}
2.2.7模糊查询 fuzzy 最大模糊错误 0-2个
模糊关键字长度等于2,不能有模糊错误 0
模糊关键字长度3-5,允许最大有1个模糊错误 0 1
模糊关键字大于5,允许最大有2个模糊错误 0 1 2
GET /es_test/_search
{
"query": {
"fuzzy": {
"name": {
"value": "zhang"
}
}
}
}
注意事项
2.2.8 bool查询
must 等价于逻辑运算的&&
should 等价于||
must_not 等价于!
GET /es_test/_search
{
"query":{
"bool":{
"must":[
{
"term":{
"age":{
"value":"14"
}
}
},
{
"term":{
"name":{
"value":"zhangsan4444"
}
}
}
]
}
}
}
2.2.9 高亮查询
GET /es_test/_search
{
"query":{
"term": {
"name": {
"value": "name1"
}
}
},
"highlight":{
"fields":{
"name":{}
}
}
}
2.2.10 多字段查询
GET /es_test/_search
{
"query":{
"multi_match": {
"query": "name1",
"fields":["name","content"]
}
}
}
2.2.10 多字段分词查询,可以指定分词器
GET /es_test/_search
{
"query":{
"query_string": {
"query": "北海", //查出含有北和海的结果
"fields":["name","content"]
}
}
}
分词(type-text)
只有text类型分词:默认分词器为标准分词器,分词器对中文单字分词,对英文一个单词分词
type-keyword,integer,date:不分词
搜索原理
IK分词器-中文分词器
直接命令行安装
进入到bin目录,按照自己的版本下载
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.16.2/elasticsearch-analysis-ik-7.16.2.zip
直接下载
https://github.com/medcl/elasticsearch-analysis-ik/releases 按照自己的版本下载
测试分词器
GET /_analyze
{
"text":"中华人民共和国国歌",
"analyzer": "ik_smart"
}
创建索引指定分词器
PUT /blog_test
{
"mappings": {
"properties": {
"id": {"type": "integer"},
"title": {
"type": "text",
"analyzer": "ik_max_word"
},
"content": {
"type": "text",
"analyzer": "ik_max_word"
},
"time": { "type": "date"},
"total": {"type": "integer"}
}
}
}
POST /blog_test/_doc
{
"id":1,
"title":"国内新闻",
"content":"疫情得到有效控制,北京冬奥会将如期举行",
"total":1,
"time":"2022-01-18"
}
POST /blog_test/_doc
{
"id":2,
"title":"国际新闻",
"content":"美丽锅疫情失去控制,感染人数超过6千万人,死亡人数80多万",
"total":1,
"time":"2022-01-18"
}
POST /blog_test/_doc
{
"id":3,
"title":"国际新闻",
"content":"某欧洲国家与某印签署大额军火交易订单,某印支付600亿元购买军火",
"total":1,
"time":"2022-01-18"
}
GET /blog_test/_search
{
"query":{
"query_string": {
"query": "交易,军火",
"fields":["title","content"]
}
}
}
//ik扩展,指定扩展词典
elasticsearch-7.16.2\plugins\analysis-ik\IKAnalyzer.cfg 指定扩展词典
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<entry key="ext_dict">extra_test.dic</entry>
<entry key="ext_stopwords"></entry>
</properties>
坑:本地安装ik分词器和在线安装的ik分词器的配置文件不在一个目录,特别需求注意,
优先读取 es下的config\analysis-ik\ 的配置文件 IKAnalyzer.cfg
没有才读取 es下的plugins\analysis-ik\config\IKAnalyzer.cfg目录下的配置文件
!!!!添加扩展字典后,之前添加的数据不会生效,要生效的话必须重新插入数据,才会生效。
filter Query
2.2.11 范围过滤 must
GET /blog_test/_search
{
"query":{
"bool":{
"must":[{
"term":{
"content": {
"value":"蓝瘦"
}
}
}
],
"filter": [
{
"range": {
"total": {
"lte": 2,
"gte": 20
}
}
}
]
}
}
}
2.2.12 文本过滤
GET /blog_test/_search
{
"query":{
"bool":{
"must":[{
"term":{
"title": {
"value":"网络"
}
}
}
],
"filter": [
{
"term":{
"content": {
"value":"蓝瘦"
}
}
}
]
}
}
}