1. 由 Elasticsearch 开始的思考
官方介绍 Elasticsearch(以下简称 ES)是一个基于 Apache Lucene(TM)的开源搜索引擎. 但我最初了解 ES 却是从 NoSQL 数据库开始, 在使用, 研究了 ES 一段时间后, 我发现这是一个优秀的分布式部署软件, 不仅是一个全文搜索引擎, 还是一个分布式存储系统, 一个分布式数据库.
在 ES 之前我们习惯使用关系数据库 (RDBMS) 来进行现实数据世界的建模, 将现实世界中的领域模式表示为实体 - 关系模型 (E-R 模型). 但现实世界的领域本体(Ontology) 是如此复杂, 领域对象中的关系不止是关联关系, 可能还有父子 (从属) 关系, 依赖关系等一些更复杂的关系. 在软件世界中, 我们一直在苦苦探索如何有效表达现实世界领域本体的软件模型, 对象数据库一直是数据库界希冀用来表达领域模型的利器, 但时至今日, 仍缺乏具有口碑的产品.
十几年前, 我还在攻读计算机科学博士学位, 研究领域本体的知识表达与软件建模. 那时 xml 和 RDF(Resource Description Framework, 资源描述框架)是流行的领域本体表达形式, 因而也催生了 xml 数据库, xml 柔性查询 (或半柔性查询) 之类的技术与一些不太成熟的产品. 当时感觉最需要的就是一个能够存储, 快速检索领域知识的数据库, 但主流的关系数据库产品在这方面存在一些天然的缺陷.
ES 是我使用过的 NoSQL 数据库产品中被认为最适合用于领域本体建模的系统(如内置父子关系的映射), 同时也是学习分布式软件架构的最好示例系统.
2. 知识导图全景
ES 的知识点众多, 发展到今天, 已经 release 到 7.0 版本. 从 6.0 版本开始, ES 在数据模型上做了一个重大变化: 基于查询和存储效率考虑, ES 在 index 中删除了 type 的概念, 即在一个 index 中只有一个 type, 而在 6.0 之前的版本, 一个 index 中允许创建多个 type.
ES 的生态也在逐渐发展, ES 与 Logstash 及 Kibana 构成应用栈, 可轻松构建一个采集大数据, 多维度分析大数据的数据仓库系统.
在这里, 我把 ES 中一些主要的知识点以导图的形式 (还会不断完善) 展现出来, 如图 1 所示.
图 1
图 1 中的知识点简单描述如下:
分布式构架: ES 采用典型的主 / 从 (master/slave) 分布式架构. ES 集群中只有一个主节点 (node, 最小的可用主节点数目可设置), 主从节点通过选举机制产生. 在 ES 中, 一个 index 可使用多个分片(shard) 来存贮, 分片同样使用主 / 从方式, 主从分片在读写数据的权限不同.
映射 (mapping): 如同 xml 使用 xml Schema 作为元数据来描述 xml 数据对象的框架一样, ES 中的映射本质是描述 index 中数据对象的元数据, 它定义了数据对象的结构, 格式已经各个字段(field) 对应的数据类型. ES 中的映射可以在创建 index 时自行创建, 也可以由系统实现动态映射.
集群数据管理: 对于 ES 中的数据对象: index 和 document(在 ES 中, 将一个使用 JSON 对象表示的数据对象称为一个文档),ES 提供访问接口实现对 index 和 document 的增删改查操作(支持批量操作). 对于集群中的其它元数据, ES 也提供访问接口对集群, 节点进行操作.
搜索 (search): 全文搜索时 ES 的核心功能, ES 提供了专用于查询的 DSL(Domain Specified Language, 领域专用语言), 也提供了基于 URL 的简易搜索形式. 在搜索的同时 ES 也提供聚合(Aggregation) 和排序对数据进行处理.
SQL 访问: ES 提供了 xpack 插件形式的 SQL 访问形式, 用户可以使用 REST API 访问接口使用 SQL 语言像使用关系数据库一样对数据进行查询.
3. 参考文献
Clinton Gormley &Zachary Tong, Elasticsearch: The Definitive Guide,2015
来源: http://www.jianshu.com/p/8eb61eede65f