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 /
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 //_doc/<_id>
PUT /report_index_1/_doc/1
{
"cover_url":"test2",
"activation":100
}

#不指定id
POST //_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 //_mapping
PUT /report_index_1/_mapping
{
"properties": {
"creative_create_time": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}

更新doc

#按id更新
PUT //_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 /
DELETE /report_index_1

删除doc

DELETE //_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
}


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

你可能感兴趣的:(elastic_search 入门使用)