什么是Elasticsearch
Elaticsearch简称为ES,是一个开源的可扩展的分布式的全文检索引擎,它可以近乎实时的存储、检索数据。本身扩展性很好,可扩展到上百台服务器,处理PB级别的数据。ES使用Java开发并使用Lucene作为其核心来实现索引和搜索的功能,但是它通过简单的RestfulAPI和javaAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。
ES的作用
分布式的搜索引擎
分布式:Elasticsearch自动将海量数据分散到多台服务器上去存储和检索
全文检索
提供模糊搜索等自动度很高的查询方式,并进行相关性排名,高亮等功能
数据分析引擎(分组聚合)
电商网站,最近一周笔记本电脑这种商品销量排名top10的商家有哪些?新闻网站,最近1个月访问量排名top3的新闻板块是哪些
对海量数据进行近实时的处理
海量数据的处理:因为是分布式架构,Elasticsearch可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理
近实时:Elasticsearch可以实现秒级别的数据搜索和分析
ES的使用场景
- 搜索类场景
比如说电商网站、招聘网站、新闻资讯类网站、各种app内的搜索。 - 日志分析类场景
经典的ELK组合(Elasticsearch/Logstash/Kibana),可以完成日志收集,日志存储,日志分析查询界面基本功能,目前该方案的实现很普及,大部分企业日志分析系统使用了该方案。 - 数据预警平台及数据分析场景
例如电商价格预警,在支持的电商平台设置价格预警,当优惠的价格低于某个值时,触发通知消
息,通知用户购买。
数据分析常见的比如分析电商平台销售量top 10的品牌,分析博客系统、头条网站top 10关注度、评论数、访问量的内容等等。 - 商业BI(Business Intelligence)系统
比如大型零售超市,需要分析上一季度用户消费金额,年龄段,每天各时间段到店人数分布等信
息,输出相应的报表数据,并预测下一季度的热卖商品,根据年龄段定向推荐适宜产品。
Elasticsearch执行数据分析和挖掘,Kibana做数据可视化。
核心概念
索引(index)
类似的数据放在一个索引,非类似的数据放不同索引, 一个索引也可以理解成一个关系型数据库。
类型(type)
代表document属于index中的哪个类别(type)也有一种说法一种type就像是数据库的表, 比如dept表,user表。
注意ES每个大版本之间区别很大:
ES 5.x中一个index可以有多种type。
ES 6.x中一个index只能有一种type。
ES 7.x以后 要逐渐移除type这个概念,只剩doc这么一个类型。
映射(mapping)
mapping定义了每个字段的类型等信息。相当于关系型数据库中的表结构。
常用数据类型:text、keyword、number、array、range、boolean、date、geo_point、ip、 nested、object
示例:
PUT /worker_index/_mapping/
{
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"job": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
- type比如:
String类型:
text:可分词,不可参与聚合
keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
Numerical:数值类型
基本数据类型:long、interger、short、byte、double、float、half_float
浮点数的高精度类型:scaled_float:需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
Date:日期类型
elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
Array:数组类型
进行匹配时,任意一个元素满足,都认为满足
排序时,如果升序则用数组中的最小值来排序,如果降序则用数组中的最大值来排序
Object:对象
{
name:"Jack",
age:21,
girl:{
name: "Rose", age:21
}
}
如果存储到索引库的是对象类型,例如上面的girl,会把girl变成两个字段:girl.name和girl.age
- index
index影响字段的索引情况。
true:字段会被索引,则可以用来进行搜索。默认值就是true false:字段不会被索引,不能用来搜索
index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。 但是有些字段是我们不希望被索引的,比如企业的logo图片地址,就需要手动设置index为false。 - store
是否将数据进行独立存储。
原始的文本会存储在 _source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source 里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:true即可,获取独立存 储的字段要比从_source中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置, 默认为false。 - analyzer:指定分词器
一般我们处理中文会选择ik分词器 ik_max_word ik_smart
文档(Document)
相当于关系型数据库中的一行数据
在kibana中查看文档:
元数据解读
元数据 | 含义 |
---|---|
_index | document所属index |
_type | document所属type,Elasticsearch7.x默认type为_doc |
_id | 代表document的唯一标识,与index和type一起,可以唯一标识和定位一个 document |
_version | document的版本号,Elasticsearch利用_version (版本号)的方式来确保应用 中相互冲突的变更不会导致数据丢失。需要修改数据时,需要指定想要修改文 档的version号,如果该版本不是当前版本号,请求将会失败 |
_seq_no | 严格递增的顺序号,每个文档一个,Shard级别严格递增,保证后写入的Doc seq_no Doc seq_no |
_primary_term | 任何类型的写操作,包括index、create、update和Delete,都会生成一个 _seq_n。 |
found | true/false,是否查找到文档 |
_source | 存储原始文档 |
对应关系
关系型数据库 | es |
---|---|
database | index |
table | index类型(原来的type) |
row | document |
column | field |
约束(schema) | mapping |
集群的节点角色
在es的配置文件elasticsearch.yml中有几个配置
#表示这个节点是否能成为主节点
node.master: true
#表示这个节点是否会储存数据
node.data: true
如果这两个设置都为false,那么这个节点会成为客户端节点
每次连接到es集群的时候是连接到es集群中的一个节点,再通过这个节点转发到目标节点去执行操作
假如我们的es集群有3个节点
如果我们访问这个cluster的时候访问的是node2
需要操作的数据在node1上,那么node2会转发到node1上去