elastic_search 入门使用

基本概念

  • 索引(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
}


本文使用 文章同步助手 同步

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容