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/1190000004433446
相关推荐
Elasticsearch 数据结构设计文档是 ES 中的核心概念,用于定义索引的逻辑结构和字段设计。该设计主要包括索引类型别名、索引名称、类型名称、字段名称、字段类型、字段描述等几个方面。同时,该设计还涉及到 ES 的...
人大金仓数据库系统表 ...总结来说,人大金仓数据库系统的表结构提供了对数据库的全方位洞察,是数据库管理的关键。深入学习和理解这些系统表,对于提升数据库的运维能力,保障系统的稳定运行具有不可忽视的价值。
在KingbaseES中,你可以创建数据库、表,定义字段和数据类型,以及设置约束条件。 对于数据库管理,你需要学会如何启动、停止数据库服务,以及如何进行日常维护。这包括监控数据库性能、定期备份和恢复数据,以及...
可以自定义导出数据库的表结构(视图)的一个存储过程 功能: 1.可以完整导出表结构(含主键,索引) 2.可以导出视图SQL语法 3.可以带自己定义的栏位的说明 MS SQL Server200 -2008 测试通过 导出所有表,视图(所有表是...
映射类似于传统关系型数据库中的表结构。合理且正确地定义映射对于实现高效的搜索和数据分析至关重要。 1. **定义数据类型**:映射规定了每个字段的数据类型,例如整数、日期、文本等。这是确保数据存储和检索符合...
在IT领域,尤其是在大数据分析和实时检索的场景中,Elasticsearch(ES)因其高效、灵活的特性,已经成为一种广泛使用的工具。本文将深入探讨在处理大宽表应用中的实践案例,以及面临的挑战和解决方案。 首先,我们...
文档:文档是可以被索引的基本数据单位,相当于 MySQL 数据库表中的一行记录。 分片:每个索引都有多个分片,每个分片是一个 Lucene 索引。 基本用法 ElasticSearch 以 Restful 风格命名 API,API 基本格式为: ...
* Mapping:映射关系,相当于表结构的定义。 * Cluster:集群,集群是一个或多个节点(服务器)的集合,这些节点一起保存您的全部数据,并在所有节点之间提供联合索引和搜索功能。 * Node:节点,节点是一台服务器,...
- **索引(Index)**:类似于数据库中的表,用于存储具有相似结构的数据。 - **类型(Type)**:在6.x版本后被文档映射(Mapping)取代,用于定义索引中每个字段的数据类型。 - **文档(Document)**:索引中的最小数据...
- **映射**: 定义了每个字段的数据类型、分词器等设置,类似关系型数据库中的表结构。 - **文档**: ElasticSearch 中最小的数据单元,以 JSON 格式存储,相当于关系型数据库中的一条记录。 - **倒排索引**: Elastic...
3. **索引(Index)**:类似于关系数据库中的表,用于存储具有相同结构的数据。在Elasticsearch中,索引是文档的容器。 4. **类型(Type)**:在旧版本中,索引内部可以定义多个类型,但在7.0版本之后已被弃用,...
1. **配置HBase**: 首先,需要在HBase中设置必要的配置,例如定义数据模型和表结构,确保它们与Elasticsearch的映射相匹配。HBase的行键(Row Key)通常对应Elasticsearch文档的ID。 2. **安装和配置Elasticsearch ...
6. **映射(Mapping)**: 定义文档字段的数据类型和结构,类似于数据库的表结构。 ### 二、Elasticsearch Java API基础操作 1. **创建客户端**: 使用`TransportClient`或`RestHighLevelClient`,前者通过TCP传输层与...
定义了索引中文档的结构,类似于关系型数据库中的表结构定义。可以显式定义或由Elasticsearch自动检测。 **Indexed(索引化):** 指创建文档索引的过程。默认情况下,所有字段都会被索引,但也可以根据需求选择不...
- **ESHead**: 一种图形化管理工具,帮助管理和监控ElasticSearch。 - **安装方法**: 对于2.4.x版本,可以直接下载并解压至`plugins`目录下。 - **访问**: 浏览器访问http://localhost:9100。 #### 四、Elastic...
3. **类型(Type)**:在一个索引中定义文档的结构,但自 Elasticsearch 6.0 起已被废弃,所有文档都属于单个 `_doc` 类型。 4. **节点(Node)**:运行 Elasticsearch 实例的服务器,多个节点组成一个集群。 5. **...