基础概念
ElasticSearch是什么?
- Elasticsearch是一个开源的搜索引擎,基于全文搜索引擎库Lucene。
- Lucene是一个开源的全文搜索引擎库,但Lucene非常复杂,普通玩家玩不了。为了隐藏Lucene的复杂性,Elasticsearch在Lucene的基础上进行了封装,提供了一套简单一致的RESTful API,提供了分布式存储,提供了准实时的分析引擎和搜索引擎。
ElasticSearch的使用场景
- 面向搜索 —— 全文检索,英文分词/中文分词
- 面向分析 —— 数据聚合,统计分析
- 时间序列数据库 —— http://www.infoq.com/cn/articles/database-timestamp-01 / 02 / 03
Near Realtime(NRT)
- ES基本上可以做到实时搜索,从数据写入ES到可搜索到该数据,延迟大概是1秒左右(这个数值可以配置)
Cluster && Node
- 集群和节点。
- ES是一个分布式的系统,可以通过增加新的服务器,非常便捷的进行横向扩展。
- 每个ES运行实例称为一个Node节点。
- 多个ES节点组成一个集群。集群中有有一个Master节点,该节点是动态选举出来的,一旦当前的Master节点宕机了,集群会自动选举出新的Master节点。
Index && Type
- 索引。
- 索引是ES中数据的容器。概念上,索引类似mysql中的database。
- 索引下可以有多个Type,Type的概念类似mysql中的table。
- 但是,需要谨记的是,Type跟mysql中的table有很大不同,体现在:
- 1) 同一个index下的所有type,应该具备相似属性
- 2) 同一个index下,不同的type中的字段,如果字段同名,那么这些字段应该是同一类型的
- 3) ES中有许多优化和操作,都是基于index的
- 4) 在以后的ES版本中,可能会去掉Type的概念
Document
- 文档。
- ES中的文档,在概念上相当于mysql的row,但比row更灵活。
- ES中的文档是一个JSON对象,即使在同一个type中,不同的document的字段可以不一样。也允许动态增加新的字段。文档中每个字段有固定的类型,包括整数、日期、文本等等,甚至可以嵌套JSON对象。
Mapping
- 相当于mysql中的schema(即表的结构定义),用来规定文档中的字段类型
- 但要注意的是,已经创建的索引,不能变更字段的类型。
- 字段的类型很丰富,除了常规的数字、日期、字符串之外,还可以是GEO-Point、GEO-shape、IP
Analyze && Term
- 分词。
- 对一段文本(text)进行分词处理,得出一系列的词(token)。
- ES除了会对存储的字段进行分词处理外,在搜索的时候,也会对搜索的文本进行分词处理。
- ES中内置有很多分词器,比较常见的有standard、whitespace、english等等。对于中文分词,则常用ik。
- 我们在mapping中,可以指定字段的分词器。
- 一个分词,在ES中,通常称之为一个Term。
- 中文分词示例
-
curl -X GET "localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
"analyzer" : "ik_max_word",
"text" : "中华人民共和国,我的祖国,我爱你!!!”
}
'
Shards && Replicas
- shard:分片
- replica:分片的副本
- shards和replicas是ES分布式能力的体现,虽然对用户来说是透明的,但理解它们,有助于你理解ES的查询和聚合结果
Shard
- 一个index所包含的数据可以非常的大(TB级别),通常一台单独的机器是无法承载的。