计算机系统应用教程网站

网站首页 > 技术文章 正文

elastic_search 入门使用 elasticsearch-curator

btikc 2024-10-29 13:12:56 技术文章 5 ℃ 0 评论

基本概念

  • 索引(index) 一个 索引 类似于传统关系数据库中的一个 表 ,是一个存储关系型文档的地方
  • 文档类型(type) 【7.0版本后移除】
  • 文档(doc)

一个doc代表索引里的一条数据,像数据库表里的一条记录,doc是用json格式来存储数据

es架构设计

架构各组件简单释义:

  • gateway 底层存储系统,一般为文件系统,支持多种类型。
  • distributed lucence directory 基于lucence的分布式框架,封装了建立倒排索引、数据存储、translog、segment等实现。
  • 模块层 ES的主要模块,包含索引模块、搜索模块、映射模块。
  • Discovery 集群node发现模块,用于集群node之间的通信,选举coordinate node操作,支持多种发现机制,如zen,ec2等。
  • script 脚本解析模块,用来支持在查询语句中编写的脚本,如painless,groovy,python等。
  • plugins 第三方插件,各种高级功能可由插件提供,支持定制。
  • transport/jmx 通信模块,数据传输,底层使用netty框架
  • restful/node 对外提供的访问Elasticsearch集群的接口
  • x-pack elasticsearch的一个扩展包,集成安全、警告、监视、图形和报告功能,无缝接入,可插拔设计。

图片来源:掘金

请求逻辑图


来源:架构师修炼

创建、删除、变更操作

创建索引

PUT /<index>
PUT /report_index_1
{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 1
    },
    "mappings": {
        "properties": {
            "action_cost": {
                "type": "double"
            },
            "activation": {
                "type": "long"
            },
            "advertiser_name": {
                "type": "text",
                "fields":{
                    "keyword":{
                        "type":"keyword"
                    }
                }
            },
            "cover_url": {
                "type": "keyword"
            },
            "created_at": {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd HH:mm:ss.SSS ||yyyy-MM-dd || epoch_millis || strict_date_optional_time || yyyy-MM-dd'T'HH:mm:ss'+'08:00"
            }
        }
    }
}

创建doc

#指定id
PUT /<index>/_doc/<_id>
PUT /report_index_1/_doc/1
{
  "cover_url":"test2",
	"activation":100
}
#不指定id
POST /<index>/_doc
POST /report_index_1/_doc/
{
  "cover_url":"test2",
  "activation":200
}
#创建时如果已经存在doc, 报异常
PUT /report_index_1/_doc/10/_create
{
  "cover_url": "test10",
  "activation": 1000
}

批量创建和操作

POST _bulk
{"index":{"_index":"report_index_1","_id":"1"}}
{"cover_url":"test1","activation":100, "advertiser_name":"张三, 今天星期一"}
{"index":{"_index":"report_index_1","_id":"2"}}
{"cover_url":"test2","activation":200,"advertiser_name":"李四,今天星期二"}
{"index":{"_index":"report_index_1","_id":"3"}}
{"cover_url":"test3","activation":300,"advertiser_name":"王五 今天星期三"}
{"index":{"_index":"report_index_1","_id":"4"}}
{"cover_url":"test4","activation":400, "advertiser_name":"马六 今天星期四"}
{"create":{"_index":"report_index_1","_id":"5"}}
{"cover_url":"test5","activation":500, "advertiser_name": "广告主"}
{"delete":{"_index":"report_index_1","_id":"5"}}
{"update":{"_id":"1","_index":"report_index_1"}}
{"doc":{"cover_url":"test11"}}

更新index字段

es不支持对已存在字段做类型变更,如需要变更,需要reindex

PUT /<index>/_mapping
PUT /report_index_1/_mapping
{
    "properties": {
        "creative_create_time": {
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss"
        }
    }
}

更新doc

#按id更新
PUT /<index>/_doc/<_id>
PUT /report_index_1/_doc/227
{
	"advertiser_name" : "嗨寿司-李"
}
#按条件更新
POST /report_index_1/_update_by_query
{
  "query": {
    "term": {
      "advertiser_name": "嗨寿司-李"
    }
  } ,
  "script": {
    "source": "ctx._source['advertiser_name'] = '嗨寿司'"
  }
}

删除索引

DELETE /<index>
DELETE /report_index_1

删除doc

DELETE /<index>/_doc/<_id>
DELETE /report_index_1/_doc/137

清空doc

POST /report_index_1/_delete_by_query
{
    "query": {
       "match_all": {}
     }
}

常用的查询类型

一般查询

  • 查询index全部数据
GET /report_index_1/_search
{   
  "query": {
    "match_all": {}
  }
}
  • 指定id查询
GET /report_index_1/_doc/1
  • 模糊查询
GET /report_index_1/_search
{
  "query": {
    "wildcard": {
      "cover_url": {
        "value": "*4*"
      }
    }
  }
}
  • 存在字段(exists)查询
GET /report_index_1/_search
{
  "query": {
    "exists": {
      "field": "cover_url"
    }
  }
}
  • 范围查询
GET /report_index_1/_search
{
  "query":{
    "range": {
      "activation": {
        "gt": 1,
        "lte": 200
      }
    }
  }
}
  • 精准查询
GET /report_index_1/_search
{
  "query":{
    "term": {
      "_id": {
        "value": "1"
      }
    }
  }
}
  • 正则查询
GET /report_index_1/_search
{
  "query": {
   "regexp": { 
       "advertiser_name":"张*"
    } 
  }
}
  • 复合查询(bool查询)

bool query 可以用来合并多个过滤条件查询结果,它包含这如下几个操作符:

must : 查询必须出现在匹配的文档中

filter: 对于must,查询的分数将被忽略。缓存查询

must_not : 查询不得出现在匹配的文档中

should : 查询应该出现在匹配的文档中。(不强制匹配,如果匹配到,score更大,如果不存在must,至少一个should查询匹配)

所有 must 语句必须匹配,所有 must_not 语句都必须不匹配,但有多少 should 语句应该匹配呢?默认情况下,没有 should 语句是必须匹配的,只有一个例外:那就是当没有 must 语句的时候,至少有一个 should 语句必须匹配。就像我们能控制 [match 查询的精度](https://www.elastic.co/guide/cn/elasticsearch/guide/current/match-multi-word.html#match-precision) 一样,我们可以通过 minimum_should_match 参数控制需要匹配的 should 语句的数量,它既可以是一个绝对的数字,又可以是个百分比 .

GET /report_index_1/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "_id": [
              "1",
              "2"
            ]
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "cover_url": {
              "value": "test2"
            }
          }
        }
      ],
      "should": [
        {
          "term": {
            "cover_url": {
              "value": "test1"
            }
          }
        }
      ]
    }
  }
}

文本查询

目前线上es文本分词用的是IK分词器

官方提供的分词器:

Fingerprint、Keyword、Language、Pattern、Simple、Standard、Stop、Whitespace

IK分词(中文):

IK analyzer: ik_smart, ik_max_word

  • math
GET /report_index_1/_search
{
  "query": {
    "match": {
      "advertiser_name": {
        "query": "马六 今天",
        "analyzer": "standard"
      }
    }
  }
}
  • math_phrase
GET /report_index_1/_search
{
  "query": {
    "match_phrase": {
      "advertiser_name": {
        "query": "马六 今天",
        "analyzer": "standard"
      }
    }
  }
}
  • 查看分析效果
POST /_analyze?pretty=true
{
  "text":"张三, 今天星期一",
  "tokenizer":"ik_max_word"
}

聚合查询(Aggregation)

  • bucket aggregation

相当于db的group by

分捅聚合

GET /report_index_1/_search
{
  "query":{
    "range":{
      "activation":{
        "gte":300
      }
    }
  },
  "size": 0,
  "aggs": {
    "my-agg-name": {
      "terms": {
        "field": "advertiser_name.keyword"
      }
    }
  }
}
  • metric aggregation

相当于db的聚合函数;max、avg

GET /report_index_1/_search
{
  "query":{
    "range":{
      "activation":{
        "gte":300
      }
    }
  },
  "size": 0,
  "aggs": {
    "my-agg-name-avg":{
      "avg": {
        "field": "activation"
      }
    }
  }
}
  • bucket 和 metric 组合查询
GET /report_index_1/_search?pretty
{
  "size":0,
  "aggs": {
    "my-agg-name": {
      "terms": {
        "field": "advertiser_name.keyword"
      },
      "aggs": {
        "my-sub-agg-name": {
          "avg": {
            "field": "activation"
          }
        }
      }
    }
  }
}
  • pipe line aggregation

管道聚合处理的对象是其它聚合的输出(桶或者桶的某些权值),而不是直接针对文档。

管道聚合的作用是为输出增加一些有用信息。

buckets_path:用于计算均值的权值路径

{
    "aggs" : {
        "sales_per_month" : {
            "date_histogram" : {
                "field" : "date",
                "interval" : "month"
            },
            "aggs": {
                "sales": {
                    "sum": {
                        "field": "price"
                    }
                }
            }
        },
        "avg_monthly_sales": {
            "avg_bucket": {             //对所有月份的销售总 sales 求平均值
                "buckets_path": "sales_per_month>sales" 
            }
        }
    }
}

集群基本信息查询

  • 查看集群基本信息
GET /
  • 查看集群节点信息
GET /_cluster/health?pretty
  • 查看集群所有index
GET /_cat/indices
  • 查看index mapping信息
GET /report_index_1/_mapping

例子

报表条件查询

POST /report_index_1/_search
{
    "aggregations":{
        "count":{
            "cardinality":{
                "field":"unit_id"
            }
        },
        "group":{
            "aggregations":{
                "bucket_sort":{
                    "bucket_sort":{
                        "size":20
                    }
                },
                "lately_top_hit":{
                    "top_hits":{
                        "size":1,
                        "sort":[
                            {
                                "unit_create_time":{
                                    "order":"desc"
                                }
                            }
                        ]
                    }
                },
                "max_create_time":{
                    "max":{
                        "field":"unit_create_time"
                    }
                },
                "sum_aclick":{
                    "sum":{
                        "field":"aclick"
                    }
                },
                "sum_bclick":{
                    "sum":{
                        "field":"bclick"
                    }
                },
                "sum_charge":{
                    "sum":{
                        "field":"charge"
                    }
                },
                "sum_photo_click":{
                    "sum":{
                        "field":"photo_click"
                    }
                },
                "sum_show":{
                    "sum":{
                        "field":"show"
                    }
                }
            },
            "terms":{
                "field":"unit_id",
                "order":[
                    {
                        "max_create_time":"desc"
                    }
                ],
                "size":20
            }
        },
        "sum_aclick":{
            "sum":{
                "field":"aclick"
            }
        },
        "sum_bclick":{
            "sum":{
                "field":"bclick"
            }
        },
        "sum_charge":{
            "sum":{
                "field":"charge"
            }
        },
        "sum_photo_click":{
            "sum":{
                "field":"photo_click"
            }
        },
        "sum_show":{
            "sum":{
                "field":"show"
            }
        }
    },
    "from":0,
    "query":{
        "bool":{
            "filter":[
                {
                    "range":{
                        "stat_date":{
                            "format":"yyyy-MM-dd",
                            "from":"2021-06-08",
                            "include_lower":true,
                            "include_upper":true,
                            "to":"2021-06-08"
                        }
                    }
                },
                {
                    "term":{
                        "campaign_id":62935142
                    }
                }
            ]
        }
    },
    "size":0
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表