一、Elasticsearch
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
特点:
① 分布式的实时文件存储,每个字段都被索引并可被搜索
② 分布式的实时分析搜索引擎--做不规则查询
③ 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
通俗些,ES能做什么呢?
全文检索(全部字段)、模糊查询(搜索)、数据分析(提供分析语法,例如聚合)
二、同类产品对比
1、【Solr、ES】与【Hermes】对比
【Solr、ES】:
① 源自搜索引擎,侧重搜索与全文检索
② 数据规模从几百万到千万不等,数据量过亿的集群特别少。有可能存在个别系统数据量过亿,但这并不是普遍现象
【Hermes】:
① 一个基于大索引技术的海量数据实时检索分析平台。侧重数据分析
② 数据规模从几亿到万亿不等。最小的表也是千万级别
在腾讯17 台TS5机器,就可以处理每天450亿的数据(每条数据1kb左右),数据可以保存一个月之久
2、【Solr】与【ES】对比
相同点:
基于lucene,支持全文检索、搜索、分析
不同点:
① Solr利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理
② Solr支持更多格式的数据,而 Elasticsearch 仅支持json文件格式
③ Solr官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供
④ Solr在传统的搜索应用中表现好于Elasticsearch,但在处理实时搜索应用时效率明显低于Elasticsearch
PS:Lucene是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。
三、交互方式
1、基于HTTP协议,以JSON为数据交互格式的RESTfulAPI
GET POST PUT DELETE HEAD
2、Elasticsearch官方提供了多种程序语言的客户端—java,Javascript,.NET,PHP,Perl,Python,以及 Ruby,社区还提供了很多客户端和插件。
四、操作方式
1、浏览器
2、Postman
3、Linux命令行
4、Kibana的Dev Tools
五、数据存储方式
1、存储方式
① 面向文档
Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这种理解数据的方式与以往完全不同,这也是Elasticsearch能够执行复杂的全文搜索的原因之一。
② JSON
ELasticsearch使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。它简洁、简单且容易阅读。
2、存储结构
索引 index:
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。
类型 type:
ES6之后,一个index中只能有一个type(形同虚设),ES7直接就把type干掉了。
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
文档 document:
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。
字段 field:
相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。
3、操作演示
我先使用如下语句创建一份文档
POST user/doc
{
"name":"xiaobai",
"age":18
}
再使用此语句查询 GET user/doc/_search,结果如下
六、数据类型
1、核心数据类型
字符串型:text、keyword
数值型:long、integer、short、byte、double、float、half_float、scaled_float
日期类型:date
布尔类型:boolean
二进制类型:binary
范围类型:integer_range、float_range、long_range、double_range、date_range
2、复杂数据类型
数组类型:array
对象类型:object
嵌套类型:nested object
3、地理位置数据类型
点:geo_point
形状:geo_shape
4、专用类型
记录IP地址:ip
实现自动补全:completion
令牌计数:token_count
记录字符串hash值:murmur3
多字段特性:multi-fields 允许对同一个字段采用不同的配置,比如分词,例如对人名实现拼音搜索,只需要在人名中新增一个子字段为pinyin即可
ES(二) ElasticSearch 安装—Linux单机