Elasticsearch 是一个分布式、可扩展、开源的全文搜索与数据分析引擎。它可以存储、搜索、分析 PB 级别的近实时数据。Elasticsearch 使用 Lucene 作为其核心来实现所有的索引和搜索功能,通过简单的Restful API 隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
功能
Elasticsearch 主要有以下几个功能:
1 结构化搜索
结构化搜索是指有关探询那些具有内在结构数据的过程。比如日期、时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作。比较常见的操作包括比较数字或时间的范围,或判定两个值的大小。
文本也可以是结构化的。如彩色笔可以有离散的颜色集合: 红(red)
、 绿(green)
、 蓝(blue)
。
在结构化查询中,我们得到的结果总是非是即否,要么存于集合之中,要么存在集合之外。
2 全文搜索
全文搜索就是对一篇文章进行索引,然后根据关键字搜索,类似于 mysql 里的 like 语句。
3 聚合
通过结构化搜索和全文搜索,如果我们有一个查询并且希望找到匹配这个查询的文档集,就好比在大海捞针。而通过聚合,我们会得到一个数据的概览。我们需要的是分析和总结全套的数据而不是寻找单个文档:
-
在大海里有多少针?
-
针的平均长度是多少?
-
按照针的制造商来划分,针的长度中位值是多少?
-
每月加入到海中的针有多少?
-
你最受欢迎的针的制造商是什么?
-
这里面有异常的针么?
优缺点
优点:
-
高可用,如果某些节点出现故障时会自动分配其他节点代替其进行工作,并会把节点故障的数据复制到其它可用的节点上。
-
横向扩展性,可以在不停机的情况下增加新的节点,以提高集群的容量和性能。
-
可以扩展到上百台服务器,处理 PB 级别的结构化和非结构化数据。
缺点:
-
Elasticsearch 不支持 ACID 事务,无法保证多个文档处于同一个事务中。
-
Elasticsearch 的搜索是伪实时性的,默认情况下,文档从添加到对外可见能够被搜到最少要1秒钟。这么做是Lucene 为了提高写操作的吞吐量而做出的延迟牺牲,当然这个设置是可以手动调整的,但是并不建议修改它,会极大地影响搜索性能。
-
mapping 不可变,如果需要改变付出的代价十分高的。
-
默认情况下,在写入文档时,需要创建和刷新索引数据,所以写入性能不高。更新和删除操作时需要 merge 操作,也会影响性能。
应用场景
Elasticsearch 根据其特点有以下几种场景:
-
站内搜索:Elasticsearch 是一个强大的全文搜索引擎。
-
大数据的实时搜索、存储、统计。
-
监控:统计、日志等时序数据的存储和分析、可视化。
参考文档: