之前接触了janus,从架构就知道它底层存储依赖两个.主要是cassandra和elasticsearch(es),那么今天来了解一下es本身. [elastic : 弹性的]
参考 : elasticsearch权威指南 (gayhub有翻译小组) , zhihu-ES专栏 (进阶使用)
0x00.前身
ES出现于2010年,是基于Apache的开源搜索引擎Lucene(注意: **读音类似Lu-seen **) 改造而来.(同样基于的还有Solr[‘səulə],但是应该已经被es后来居上了据说Lucene的设计理念,性能,功能都很好. 有待考证..:) 但是由于lucene只是一个java写的库,使用复杂麻烦.需要深入了解搜索的相关知识才能使用好.
ES基于Lucene的核心来实现所有索引和搜索的功能,然后封装为RESTfull API便以访问,是的全文搜索之类的变得简单许多.可以在笔记本(单点弱性能),也可以在大规模集群上分布式存储并实时的计算. 它安装简单,用户可以无需了解搜索底层即可生成环境使用. (补充: K8S上的日志收集EFK中的核心E就是elasticsearch,也是因为它的这种微服务特性和良好封装性.)
ES核心三大功能 : 全文检索 , 结构化搜索 , 数据分析聚合. 并将它们简单混搭使用(主要特点).wiki/github/stackoverflow等企业都在使用es检索大量数据.
首先可以简单直观的理解: ES = SearchEngine + NosqlDB (也就是搜索引擎+数据库 两个核心组成,可以单独使用,也可以组合使用.)
0x01.索引
说数据存储,不例外的要先说数据类型.比如常见的K-V对,关系型,对象型. ES主要使用的是对象型,也就是JSON/文档格式. (据说比MongoDB读写更快–原因待查)
1 | //json大家应该都比较熟了,就只简单列个各种组合都有的例子. |
es会对json的内容进行索引,那么具体索引什么呢? 索引某些属性键? 还是索引所有属性呢?接着来看索引这个概念在es中,是很重要特别的. 下面用index替代 (因为含义有几个.)
Index:
- 名词 :这个时候类似于mysql中的一个db名. 比如
info表这就是info index(复数: indexes / indices) - 动词 : 类似mysql中的
insert(插入),index a document就是新增一个文档数据 (注意文档如果已存在,则是覆盖,而不是追加.) - 索引: 这才是我们以前常理解的意思. 传统db比如mysql用B+ Tree来构建索引引擎. 但是es不太一样,使用的是倒排索引 (inverted index). 之后会单独说它的特点.
默认情况所有字段都会被索引(拥有一个倒排索引),否则无法被搜到,这更普通mysql是不一样的,没有索引也可以被搜到.
1 | //对比一下关系型跟es的区别 |