序言

后面有大量类似于mysqlsum, group by查询

elk

===

elk总体架构

https://www.elastic.co/cn/products

Beat

基于go语言写的轻量型数据采集器,读取数据,迅速发送到Logstash进行解析,亦或直接发送到Elasticsearch进行集中式存储和分析。

Logstash

Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据、格式化数据,然后将数据发送到es进行存储。

ElasticSearch

Elasticsearch 是基于JSON的分布式搜索和分析引擎,是利用倒排索引实现的全文索引。

Kibana

Kibana 能够可视化 Elasticsearch 中的数据并操作。

elasticsearch

es在elk生态圈中处于核心地位,是开源大规模基于倒排索引的全文搜索分析引擎,他几乎能实时的支持存储搜索分析。

优势:

  • 横向可扩展性: 增加服务器可直接配置在集群中
  • 分片机制提供更好的分布性: 分而治之的方式来提升处理效率
  • 高可用: 提供复制(replica)机制
  • 实时性: 通过将磁盘上的文件放入文件缓存系统来提高查询速度

基本概念

  • Index: 一系列文档的集合,类似于mysql中数据库的概念
  • Type: 在Index里面可以定义不同的type,type的概念类似于mysql中表的概念,是一系列具有相同特征数据的结合。
  • Document: 文档的概念类似于mysql中的一条存储记录,并且为json格式,在Index下的不同type下,可以有许多document。
  • Shards: 在数据量很大的时候,进行水平的扩展,提高搜索性能
  • Replicas: 防止某个分片的数据丢失,可以并行得在备份数据里及搜索提高性能

elasticsearch查询语法

_cat API

查询当前es集群的相关消息,包括集群中的index数量、运行状态、当前集群所在的ip,目的在于将查询的结果以更加友好的方式输出。

  • cat: 输出_cat api中所有支持的查询命令
  • cat health: 检查es集群运行的状况
  • cat count: 可以快速的查询集群或者index中文档的数量
  • cat indices: 查询当前集群中所有index的数据,包括index的分片数、document的数量、存储所用的空间大小...
  • 其他cat api参考官方文档: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/cat.html

Search APIs

搜索数据,查询语法多,功能强大

REST request URI: 轻便快速的URI查询方法

REST request body: 可以有许多限制条件的json格式查询方法

  • "query": 在请求消息体中的query允许我们用Query DSL的方式查询。

    • "term": 查询时判断某个document是否包含某个具体的值,不会对被查询的值进行分词查询
    • "match" 将被查询值进行分词,然后用评分机制(TF/IDF)进行打分
    • "match_phrase": 查询指定段落
    • "Bool": 结合其他真值查询,通常和must should mustnot(与或非)一起组合出复杂的查询
    • "range": 查询时指定某个字段在某个特定的范围
      "range": {
      "FIELD": {# 指定具体过滤的字段
      "gte": 1,# gte: >=, gt: >
      "lte": 10
      }
      }
  • "from": 以一定的偏移量来查看我们检索的结果,缺省从检索的第一条数据开始显示
  • "size": 指定检索结果中输出的数据条数,缺省为10条
  • "sort": 允许我们将检索的结果以指定的字段进行排序显示
  • "_source": 指定检索结果输出的字段
  • "script_fields": 该类型允许我们通过一个脚本来计算document中不存在的值,比如我们需要计算install/click得到cti之类的
"script_fields": {
"FIELD": {# 指定脚本计算之后值得名称
"script": {# 脚本内的运算
}
}
}
  • "aggs": 基于搜索查询,可以嵌套聚合来组合复杂的需求
"aggs": {
"NAME": {# 指定结果的名称
"AGG_TYPE": {# 指定具体的聚合方法,
TODO: # 聚合体内制定具体的聚合字段
}
}
TODO: # 该处可以嵌套聚合
}

Query DSL

Query DSL是es提供的一套完整的基于json格式的结构化查询方法,包含两类不同的查询语义:

  • Leaf query clauses: 叶子查询句法就是在指定的字段中搜索指定的值,有match, term or range.
  • Compound query clauses: 复合查询句法会包含叶子句法或者复合句法,作用是为了多重查询,有bool or dis_max.
Query and filter context

查询语句的行为取决于它是使用查询型上下文还是过滤型上下文

  • Query context: 在这种上下文环境中,查询语句的返回的结果是”结果和查询语句的匹配程序如何“,返回的结果数据中都会带上_score值,象征匹配程度;

  • Filter context: 过滤型上下文环境中,查询语句则表面匹配与否(yes or no)。es内置式为filter context保留缓存用来提高查询性能,因此filter context

    查询的速度要快于query context

elasticsearch查询示例

_cat api查询示例

_cat查询当前es集群运行的状况

Kibana’s Console: `GET /_cat/health?v`
curl: `curl -XGET "127.0.0.1:9200/_cat/health?v"`

_cat查询当前es集群中所有的indices

Kibana’s Console: `GET /_cat/indices?v`
curl: `curl -XGET "127.0.0.1:9200/_cat/indices?v"`

_search api查询示例

创建index

PUT /customer?pretty

output:

{
"acknowledged": true,
"shards_acknowledged": true
}

插入数据

日常任务中,有时候往es插入数据的时候会出现504网关超时,这时候就需要手动的插入少量数据

PUT /rta_daily_report/campaign/164983850_rba_20170808?pretty
{
"doc": {
"cid": 164983850,
"advertiser_id": 799,
"trace_app_id": "com.zeptolab.cats.google",
"network_cid": "6656665",
"platform": 1,
"direct": 2,
"last_second_domain": "",
"jump_type": 2,
"direct_trace_app_id": "",
"mode": 0,
"third": "kuaptrk.com",
"hops": 9,
"yyyymmdd": "2017-08-07T16:00:00",
"type": "rba",
"click": 2
}
}

output:

{
"_index": "rta_daily_report",
"_type": "campaign",
"_id": "164983851_rba_20170808",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}

删除数据

指定document_id删除:

DELETE /rta_daily_report/campaign/164983850_rba_20170808?pretty

query中满足一定条件删除

POST rta_daily_report/_delete_by_query
{
"query": {
"match": {
"message": "some message"
}
}
}

根据具体document_id查询

GET rta_daily_report/campaign/145603275_m_normal_20170804?pretty

output:

{
"_index": "rta_daily_report",
"_type": "campaign",
"_id": "145603275_m_normal_20170804",
"_version": 1,
"found": true,
"_source": {
"cid": 145603275,
"advertiser_id": 457,
"trace_app_id": "id1105855019",
"network_cid": "plr_gs_ios_cn_osv9",
"platform": 2,
"direct": 1,
"last_second_domain": "tracking.lenzmx.com",
"jump_type": 7,
"direct_trace_app_id": "id1105855019",
"mode": 3,
"third": "3444.tlnk.io",
"hops": 1,
"yyyymmdd": "2017-08-03T16:00:00",
"type": "m_normal",
"click": 2,
"impression": 3,
"revenue": 0,
"install": 0
}
}

查询所有数据

URI:

GET rta_daily_report/campaign/_search?q=*&pretty

request boy:

GET rta_daily_report/campaign/_search
{
"query": {
"match_all": {}
}
}

output:

"hits": {
"total": 2705059,
"max_score": 1,
"hits": [
{
"_index": "rta_daily_report",
"_type": "campaign",
"_id": "163016610_rba_20170801",
"_score": 1,
"_source": {
"cid": 163016610,
"advertiser_id": 799,
"trace_app_id": "mappstreet.videoeditor",
"network_cid": "6287283",
"platform": 1,
"direct": 2,
"last_second_domain": "",
"jump_type": 2,
"direct_trace_app_id": "",
"mode": 0,
"third": "aff.adsbreak.com",
"hops": 8,
"yyyymmdd": "2017-07-31T16:00:00",
"type": "rba",
"click": 0
}
},
....]
}

查询特定字段,并且指定排序字段

在indices为rta_daily_report中搜索type:rba,以日期升序输出1个查询结果

URI:

 GET rta_daily_report/_search?q=type:rba&sort=yyyymmdd:asc&pretty

request bofy:

GET rta_daily_report/_search
{
"query": {
"match": {
"type": "rba"
}
},
"sort": [
{
"yyyymmdd": {
"order": "desc"
}
}
]
}

指定输出字段

查询类型为rba/b2t,按照日期降序排列,输出制定字段,并且只输出5条查询结果,如果要匹配段落,则用"match_phrase": { "address": "mill lane" }

GET rta_daily_report/_search
{
"query": {
"match": {
"type": "rba b2t"
}
},
"sort": [
{
"yyyymmdd": {
"order": "desc"
}
}
],
"_source": ["yyyymmdd", "type", "cid", "click", "revenue"],
"size": 5
}

output:

"hits": {
"total": 1327184,
"max_score": null,
"hits": [
{
"_index": "rta_daily_report",
"_type": "campaign",
"_id": "54870921_b2t_20170804",
"_score": null,
"_source": {
"revenue": 76500,
"yyyymmdd": "2017-08-03T16:00:00",
"type": "b2t",
"click": 22616,
"cid": 54870921
},
"sort": [
1501776000000
]
},

bool组合复杂查询

下例是查询类型为b2t,收入必须大于0的所有单子的click、revenue相关数据

GET rta_daily_report/_search
{
"query": {
"bool": {
"must": [
{"match": {
"type": "b2t"
}}
],
"must_not": [
{
"range": {
"revenue": {
"lte": 0
}
}
}
]
}
},
"sort": [
{
"yyyymmdd": {
"order": "desc"
}
}
],
"_source": ["yyyymmdd", "type", "cid", "click", "revenue"],
"size": 10
}

聚合查询

下例是类似于sql中的聚合查询,查询每天不同类型对应的intall总量

GET /rta_daily_report/_search
{
"size": 0,
"aggs": {
"sum_install": {
"date_histogram": {
"field": "yyyymmdd",
"interval": "day"
},
"aggs": {
"types": {
"terms": {
"field": "type.keyword",
"size": 10
},
"aggs": {
"install": {
"sum": {
"field": "install"
}
}
}
}
}
}
}
}

output

"aggregations": {
"sum_install": {
"buckets": [
{
"key_as_string": "2017-07-31T00:00:00.000Z",
"key": 1501459200000,
"doc_count": 659553,
"types": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "rba",
"doc_count": 321811,
"install": {
"value": 73835
}
},
{
"key": "m_normal",
"doc_count": 321711,
"install": {
"value": 18964
}
},

script查询

下例通过document中的click,install字段,计算出文档中不存在的数据。

GET /rta_daily_report/campaign/_search?pretty
{
"query" : {
"bool": {
"must": [
{
"range": {
"click": {
"gt": 0
}
}
},
{
"range": {
"install": {
"gt": 0
}
}
}
]
}},
"size": 100,
"script_fields": {
"cti": {
"script": {
"lang": "painless",
"inline": "1.0 * doc['install'].value / doc['click'].value"
}
}
}
}

output

"hits": {
"total": 23036,
"max_score": 2,
"hits": [
{
"_index": "rta_daily_report",
"_type": "campaign",
"_id": "160647918_rta_20170801",
"_score": 2,
"fields": {
"cti": [
0.0005970149253731343
]
}
},
{
"_index": "rta_daily_report",
"_type": "campaign",
"_id": "162293741_rta_20170801",
"_score": 2,
"fields": {
"cti": [
0.00007796055196070789
]
}
},

查询一段时间内的聚合数据

GET rta_daily_report/campaign/_search
{
"size": 0,
"aggs": {
"snaptime": {
"date_range": {
"field": "@timestamp",
"ranges": [
{
"from": "now-30d/d",
"to": "now"
}
]
},
"aggs": {
"sum_revenue": {
"sum": {
"field": "revenue"
}
}
}
}
}
} output: "aggregations": {

"snaptime": {

"buckets": [

{

"key": "2017-07-17T00:00:00.000Z-2017-08-16T03:30:16.995Z",

"from": 1500249600000,

"from_as_string": "2017-07-17T00:00:00.000Z",

"to": 1502854216995,

"to_as_string": "2017-08-16T03:30:16.995Z",

"doc_count": 18685619,

"sum_revenue": {

"value": 6631665219

}

}

]

}

}

查询某段时间内聚合数据,并且script计算额外字段

GET rta_daily_report/campaign/_search
{ "size": 0,

"aggs" : {

"cvr_per_month" : {

"date_range" : {

"field": "@timestamp",

"ranges": [

{

"from": "now-30d/d",

"to": "now"

}

]

},

"aggs": {

"sum_click": {

"sum": {

"field": "click"

}

},

"sum_install": {

"sum": {

"field": "install"

}

},

"cvr": {

"bucket_script": {

"buckets_path": {

"install": "sum_install",

"click": "sum_click"

},

"script": "1.0 * params.install / params.click"

}

}

}

}

}

} output:

"aggregations": {

"cvr_per_month": {

"buckets": [

{

"key": "2017-07-17T00:00:00.000Z-2017-08-16T03:37:22.732Z",

"from": 1500249600000,

"from_as_string": "2017-07-17T00:00:00.000Z",

"to": 1502854642732,

"to_as_string": "2017-08-16T03:37:22.732Z",

"doc_count": 18685619,

"sum_click": {

"value": 15067388421

},

"sum_install": {

"value": 7602055

},

"cvr": {

"value": 0.0005045370032012133

}

}

]

}

}

参考链接:

日期格式

查询语法1

查询语法2

kibana

logstash

TODO:

常见问题

      </div>

elasticsearch基本概念与查询语法的更多相关文章

  1. elasticsearch基本概念和基本语法

    Elasticsearch是基于Json的分布式搜索和分析引擎,是利用倒排索引实现的全文索引. 优势: 横向可扩展性:增加服务器可直接配置在集群中 分片机制提供更好的分布性:分而治之的方式来提升处理效 ...

  2. ElasticSearch 查询语法

    ElasticSearch是基于lucene的开源搜索引擎,它的查询语法关键字跟lucene一样,如下: 分页:from/size 字段:fields 排序:sort 查询:query 过滤:filt ...

  3. Elasticsearch Kibana查询语法

    Elasticsearch Kibana查询语法 2018年06月03日 23:52:30 wangpei1949 阅读数:3992   Elasticsearch Kibana Discover的搜 ...

  4. elasticsearch 基础 —— 请求体查询

    请求体查询 简易 查询 -query-string search- 对于用命令行进行即席查询(ad-hoc)是非常有用的. 然而,为了充分利用查询的强大功能,你应该使用 请求体 search API, ...

  5. Elasticsearch基本概念和使用

    Elasticsearch基本概念和使用 1.操作索引 1.1.基本概念 Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的. 对比关系: 索引( ...

  6. elasticsearch要点及常用查询

    目录 elasticsearch要点及常用查询 查询与过滤 明确查询和过滤各自的优缺点,以及适用场景. 性能上的差异 适用场景 1.kibana 中操作es-查询 Mapping映射基础 mappin ...

  7. .NET LINQ查询语法与方法语法

    LINQ 查询语法与方法语法      通过使用 C# 3.0 中引入的声明性查询语法,介绍性 LINQ 文档中的多数查询都被编写为查询表达式. 但是,.NET 公共语言运行时 (CLR) 本身并不具 ...

  8. Lucene查询语法详解

    Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...

  9. Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser

    一.Lucene的查询语法 Lucene所支持的查询语法可见http://lucene.apache.org/java/3_0_1/queryparsersyntax.html (1) 语法关键字 + ...

随机推荐

  1. 手机Web 开发中图片img 如何等比例缩放

    如果图片本身没有设置 width.height属性的话,只需要修改 max-width:100%; 就可以了 如果图片本身设置了 width.height属性的话,需要同时修改width 和heigh ...

  2. MT【273】2014新课标压轴题之$\ln2$的估计

    已知函数$f(x)=e^x-e^{-x}-2x$(1)讨论$f(x)$的单调性;(2)设$g(x)=f(2x)-4bf(x),$当$x>0$时,$g(x)>0,$求$b$的最大值;(3)已 ...

  3. [SPOJ913]QTREE2 - Query on a tree II【倍增LCA】

    题目描述 [传送门] 题目大意 给一棵树,有两种操作: 求(u,v)路径的距离. 求以u为起点,v为终点的第k的节点. 分析 比较简单的倍增LCA模板题. 首先对于第一问,我们只需要预处理出根节点到各 ...

  4. VLAN报文和非VLAN以太网报文的区别

    VLAN(Virtual Local Area Network,虚拟局域网)协议,基于802.1Q协议标准. 以太网带VLAN帧结构,是在以太网报文中,位于数据帧中“发送源MAC地址”与“类别/长度域 ...

  5. iptables(1)

    iptables配置文件:/etc/sysconfig/iptables 确认开启路由转发功能方法1:/sbin/sysctl -w net.ipv4.ip_forward=1方法2:echo 1 & ...

  6. SHOI2008仙人掌图(tarjan+dp)

    Solution 好题啊没的说. 本题需要求出仙人掌的直径,但仙人掌是一个带有简单环的一张图无法直接用树形dp求解,但它有一个好东西就是没有类似环套环的东西,所以我们在处理时就方便了一些. 思路:ta ...

  7. 利用LVS+Keepalived搭建Mysql双主复制高可用负载均衡环境

    应用背景: MySQL复制(主主,主从...)能在保证数据的备份的同时也能够做读写分离分摊系统压力,但是发生单点故障时,需要手动 切换到另外一台主机.LVS和Keppalived可以设定一个VIP来实 ...

  8. 网络分层和Http协议原理

    网络分层: 应用层 传输层 网络层 数据链路层 物理层 物理层: 比特流在节点之间的传输,是计算机连接起来的物理手段. 数据链路层: 控制网络层和物理层之间的通信,功能是在不可靠的物理线路上进行数据可 ...

  9. 点击a标签不跳转的办法

    方法1: <a href="http://www.baidu.com" onclick="return false"></a> 方法2: ...

  10. bzoj1271 秦腾与教学评估

    SB题!!! 我TM困惑了一下午,三份代码答案全都不一样,后来才发现要用long long来二分... 拿记事本一改就A了. 我TM...... 这SB题目...... 这惨痛的事实充分说明了long ...