基本概念
- 索引(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
}
本文使用 文章同步助手 同步