Elaticsearch 有非常好的查询性能,以及非常强大的查询语法。在一定场合下可以替代RDBMS做为OLAP的用途。但是其官方查询语法并不是SQL,而是一种Elasticsearch独创的DSL。主要是两个方面的DSL:

  • Query DSL(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html) 相当于SQL里的 WHERE 部分,实现各种各样的过滤文档的方式

  • Aggregation DSL (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html) 相当于SQL里的 GROUP BY 部分,实现文档按条件聚合并求一些指标(metric),比如求和求平均这些

这两个DSL说实话是不好学习和理解的,而且即便掌握了写起来也是比较繁琐的,但是功能却非常强大。本系列文章是为了两个目的:

  • 通过类比SQL的概念,实验并学习Elasticsearch聚合DSL的语法和语义

  • 用 python 实现一个翻译器,能够使用 SQL 来完成 Elasticsearch 聚合DSL一样的功能。这个小脚本可以在日常工作中做为一件方便的利器

基础Elasticsearch知识(比如什么是文档,什么是索引)这里就不赘述了。我们的重点是学习其查询和聚合的语法。在本章中,我们先来准备好样本数据。选择的样本数据是全美的股票列表(http://www.nasdaq.com/screening/company-list.aspx)。选择这份数据的原因是因为其维度比较丰富(ipo年份,版块,交易所等),而且有数字字段用于聚合(最近报价,总市值)。数据下载为csv格式(https://github.com/taowen/es-monitor/tree/master/sample),并且有一个导入脚本(https://github.com/taowen/es-monitor/blob/master/sample/symbol.py)

下面是导入Elasticsearch的mapping(相当于关系型数据库的表结构定义):

{"symbol": {"properties": {"sector": {"index": "not_analyzed", "type": "string"}, "market_cap": {"index": "not_analyzed", "type": "long"}, "name": {"index": "analyzed", "type": "string"}, "ipo_year": {"index": "not_analyzed", "type": "integer"}, "exchange": {"index": "not_analyzed", "type": "string"}, "symbol": {"index": "not_analyzed", "type": "string"}, "last_sale": {"index": "not_analyzed", "type": "long"}, "industry": {"index": "not_analyzed", "type": "string"}}, "_source": {"enabled": true}, "_all": {"enabled": false}}
}

对于把 Elasticsearch 当作数据库来使用,默认以下几个设置

  • 把所有字段设置为 not_analyzed

  • _source 打开,这样就不用零散地存储每个字段了,大部分情况下这样更高效

  • _all 关闭,因为检索都是基于 k=v 这样字段已知的查询的

执行python import-symbol.py导入完成数据之后,执行

GET http://127.0.0.1:9200/symbol/_count

返回

{"count":6714,"_shards":{"total":3,"successful":3,"failed":0}}

可以看到文档已经被导入索引了。除了导入一个股票的列表,我们还可以把历史的股价给导入到数据库中。这个数据比较大,放在了网盘上下载(https://yunpan.cn/cxRN6gLX7f9md 访问密码 571c)(http://pan.baidu.com/s/1nufbLMx 访问密码 bes2)。执行python import-quote.py 导入

 "quote": {"_all": {"enabled": false},"_source": {"enabled": true}, "properties": {"date": {"format": "strict_date_optional_time||epoch_millis","type": "date"},"volume": {"type": "long"},"symbol": {"index": "not_analyzed","type": "string"},"high": {"type": "long"},"low": {"type": "long"},"adj_close": {"type": "long"},"close": {"type": "long"},"open": {"type": "long"}}}

从 mapping 的角度,和表结构定义是非常类似的。除了_source,_all和analyzed这几个概念,基本上没有什么差异。Elasticsearch做为数据库最大的区别是 index/mapping 的关系,以及 index 通配这些。

原文来自:https://segmentfault.com/a/1190000003502849

ElasticSearch学习_陶文4_【01】把 Elasticsearch 当数据库使:表结构定义相关推荐

  1. ElasticSearch学习_陶文1_时间序列数据库的秘密(1)—— 介绍

    什么是时间序列数据?最简单的定义就是数据格式里包含timestamp字段的数据.比如股票市场的价格,环境中的温度,主机的CPU使用率等.但是又有什么数据是不包含timestamp的呢?几乎所有的数据都 ...

  2. ElasticSearch学习_陶文2_时间序列数据库的秘密(2)——索引

    如何快速检索? Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤.特别是它对多条件的过滤支持非常好,比如年龄在18和30之间,性别为女性这样的组合查询.倒排索引很 ...

  3. ElasticSearch学习_陶文3_时间序列数据库的秘密(3)——加载和分布式计算

    加载 如何利用索引和主存储,是一种两难的选择. 选择不使用索引,只使用主存储:除非查询的字段就是主存储的排序字段,否则就需要顺序扫描整个主存储. 选择使用索引,然后用找到的row id去主存储加载数据 ...

  4. ElasticSearch学习_陶文6_【03】把 Elasticsearch 当数据库使:简单指标

    使用 https://github.com/taowen/es-monitor 可以用 SQL 进行 elasticsearch 的查询.今天需要做一些最简单的聚合查询 COUNT(*) SQL $ ...

  5. ElasticSearch学习_陶文5_【02】把 Elasticsearch 当数据库使:过滤和排序

    使用 https://github.com/taowen/es-monitor 可以用 SQL 进行 elasticsearch 的查询.本章介绍简单的文档过滤条件 exchange='nyse' S ...

  6. 图书管理系统( JSP + JDBC + Servlet )实现-01: 流程分析和数据库建表阶段

    01: 流程分析和数据库建表阶段 02: 编写和配置过滤器(防止页面乱码) 03:项目搭建 & 工具类的实现 &依赖导入 04: 建立数据库的实体类(pojo) 05: 实现登录功能 ...

  7. elasticsearch删除索引_一文带您了解 Elasticsearch 中,如何进行索引管理(图文教程)

    在 Elasticsearch 中,索引是一个非常重要的概念,它是具有相同结构的文档集合.类比关系型数据库,比如 Mysql, 你可以把它对标看成和库同级别的概念. 今天小哈将带着大家了解, 在 El ...

  8. 数据库身份证号用什么类型_【文末送书】MySQL数据库?看这一篇干货文章就够了!...

    前言 为啥学习MySQL呢?因为MySQL是最流行的关系型数据库管理系统之一,在web应用方面,MySQL是最好的软件.MySQL所使用的sql语言是用于访问数据库的最常用标准化语言. 放心,读这期内 ...

  9. hive 自定义元数据表_[一起学Hive]之十四-Hive的元数据表结构详解

    关键字:Hive元数据.Hive元数据表结构 之前在 "[一起学Hive]之一–Hive概述,Hive是什么"中介绍过,Hive自己维护了一套元数据,用户通过HQL查询时候,Hiv ...

最新文章

  1. 欧洲两个研究团队开发出了让截肢者能感觉到并准确抓住物体的仿生手
  2. 震旦ad208如何进入维修模式_今天才知道!华为手机维修时要开启这个功能,防止隐私被他人查看...
  3. python爬去学校_python爬取学校教务系统
  4. Docker容器的生命周期管理
  5. 速度之王 — LZ4压缩算法与其他算法的比较
  6. python numpy修改数据维度
  7. 使用MVC框架中要注意的问题(一):修改首页以支持主题
  8. RocketMQ-安装使用
  9. treeset java api_JAVAAPI学习值TreeSet类
  10. 在线.class文件转换.java_支持200+文件格式的免费在线转换工具
  11. 2013全国天线年会将于11月在广州隆重召开
  12. 【MPPT光伏】基于MPPT的光伏并网系统的simulink仿真
  13. 电力拖动计算机系统考试,电力拖动自动控制系统__考试复习题.doc
  14. 浅谈企业IT技术运营中台
  15. 2017cad光标大小怎么调_怎么设置CAD中十字光标的长度
  16. mysql触发器——NEW与OLD aes_encrypt AES_DECRYPT
  17. MYSQL学习日记(三)
  18. 2.机器学习基础(一)
  19. 苹果用计算机知道密码,苹果电脑钥匙串登录密码忘了怎么办
  20. 2. Switch能否用String做参数?

热门文章

  1. 驱动LSM6DS3TR-C实现高效运动检测与数据采集(3)----获取传感器数据
  2. SMRT: Snow Microwave Radiative Transfer model
  3. paddlepaddle升级新版本
  4. GC6609 36V 2A国产超静音,低振动,256细分,全方位保护,step/dir接口或uart接口,AGC自动幅度调整 低成本替代trinamic TMC2208/2209
  5. Day04 红帽下Linux基础指令1
  6. [译] Realm 的使用入门
  7. 自动续费PHP,Hostwinds 续费教程:管理取消支付宝、PayPal 等付款方式的自动续费...
  8. 无人机航空摄影测绘技术有哪些优势?
  9. 以“业财合一”构建业务财务体系,让财务更在行,让业务会经营
  10. 巴菲特旗下公司向专注于新兴市场的金融科技公司投资6亿美元