文章目录
- 前言
- 一、Elasticsearch基础
- 1. 是什么
- 2. 功能
- 3. 特点
- 4. 企业使用场景
- 二、玩转ES之高级应用
- 1.映射高级
- 1.1地理坐标点数据类型
- 1.2动态映射
- 2.Query DSL
- 总结
前言
Elasticsearch在企业中应用广泛。本篇内容适合对ES进行巩固学习的同学,大神请略过。学知识前先听故事:
起源:Shay Banon。2004年失业,陪老婆去伦敦学习厨师。失业在家帮老婆写一个菜谱搜索引擎。封装了lucene,做出了开源项目compass。找到工作后,做分布式高性能项目,再封装compass,写出了elasticsearch,使得lucene支持分布式。现在是Elasticsearch创始人兼Elastic首席执行官。
一、Elasticsearch基础
1. 是什么
Elaticsearch简称为ES,是一个开源的可扩展的分布式的全文检索引擎,它可以近乎实时的存储、检索数据。本身扩展性很好,可扩展到上百台服务器,处理PB级别的数据。ES使用Java开发并使用Lucene作为其核心来实现索引和搜索的功能,但是它通过简单的RestfulAPI和javaAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。
2. 功能
- 分布式的搜索引擎
分布式:Elasticsearch自动将海量数据分散到多台服务器上去存储和检索
搜索:百度、谷歌,站内搜索 - 全文检索
提供模糊搜索等自动度很高的查询方式,并进行相关性排名,高亮等功能 - 数据分析引擎(分组聚合)
电商网站,最近一周笔记本电脑这种商品销量排名top10的商家有哪些?新闻网站,最近1个月访问量排名top3的新闻板块是哪些 - 对海量数据进行近实时的处理
海量数据的处理:因为是分布式架构,Elasticsearch可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理
近实时:Elasticsearch可以实现秒级别的数据搜索和分析
3. 特点
- 安装方便:没有其他依赖,下载后安装非常方便;只用修改几个参数就可以搭建起来一个集群
- JSON:输入/输出格式为 JSON,意味着不需要定义 Schema,快捷方便
- RESTful:基本所有操作 ( 索引、查询、甚至是配置 ) 都可以通过 HTTP 接口进行
- 分布式:节点对外表现对等(每个节点都可以用来做入口) 加入节点自动负载均衡
- 多租户:可根据不同的用途分索引,可以同时操作多个索引
- 支持超大数据: 可以扩展到 PB 级的结构化和非结构化数据
- 海量数据的近实时处理
4. 企业使用场景
- 搜索类场景
比如说电商网站、招聘网站、新闻资讯类网站、各种app内的搜索。 - 日志分析类场景
经典的ELK组合(Elasticsearch/Logstash/Kibana),可以完成日志收集,日志存储,日志分析查询界面基本功能,目前该方案的实现很普及,大部分企业日志分析系统使用了该方案。 - 数据预警平台及数据分析场景
例如电商价格预警,在支持的电商平台设置价格预警,当优惠的价格低于某个值时,触发通知消息,通知用户购买。
数据分析常见的比如分析电商平台销售量top 10的品牌,分析博客系统、头条网站top 10关注度、评论数、访问量的内容等等。 - 商业BI(Business Intelligence)系统
比如大型零售超市,需要分析上一季度用户消费金额,年龄段,每天各时间段到店人数分布等信息,输出相应的报表数据,并预测下一季度的热卖商品,根据年龄段定向推荐适宜产品。
Elasticsearch执行数据分析和挖掘,Kibana做数据可视化。
二、玩转ES之高级应用
1.映射高级
1.1地理坐标点数据类型
- 地理坐标点
地理坐标点是指地球表面可以用经纬度描述的一个点。 地理坐标点可以用来计算两个坐标间的距离,还可以判断一个坐标是否在一个区域中。地理坐标点需要显式声明对应字段类型为 geo_point :
PUT /company-locations
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"location": { "type": "geo_point" }
} } }
- 经纬度坐标格式
如上例, location 字段被声明为 geo_point 后,我们就可以索引包含了经纬度信息的文档了。 经纬度信息的形式可以是字符串、数组或者对象
#字符串形式 PUT /company-locations/_doc/1 {
"name":"NetEase","location":"40.715,74.011" }
#对象形式 PUT /company-locations/_doc/2 {
"name":"Sina", "location":{ "lat":40.722, "lon":73.989 } }
#数组形式 PUT /company-locations/_doc/3 {
"name":"Baidu", "location":[73.983,40.719] }
注意⚠️
字符串形式以半角逗号分割,如 “lat,lon”
对象形式显式命名为 lat 和 lon
数组形式表示为 [lon,lat]
1.2动态映射
Elasticsearch在遇到文档中以前未遇到的字段,可以使用dynamic mapping(动态映射机制) 来确定字段的数据类型并自动把新的字段添加到类型映射。
Elastic的动态映射机制可以进行开关控制,通过设置mappings的dynamic属性,dynamic有如下设置项
- true:遇到陌生字段就执行dynamic mapping处理机制
- false:遇到陌生字段就忽略
- strict:遇到陌生字段就报错
#设置为报错 PUT /user {
"settings":{ "number_of_shards": 3, "number_of_replicas": 0 },"mappings":{ "dynamic": "strict", "properties": { "name": {"type": "text"}, "address": {"type": "object", "dynamic": true} } } }
#插入以下文档,将会报错
#user索引层设置dynamic是strict,在user层内设置age将报错
#在address层设置dynamic是ture,将动态映射生成字段
PUT /user/_doc/1 {
"name": "lisi",
"age": "20",
"address": {
"province": "beijing", "city": "beijing" } }
PUT /user {
"settings":{ "number_of_shards": 3, "number_of_replicas": 0 },
"mappings":{ "dynamic": true, "properties": { "name": {"type": "text"}, "address": {"type": "object", "dynamic": true} } } }
2.Query DSL
Elasticsearch提供了基于JSON的完整查询DSL(Domain Specific Language 特定域的语言)来定义查询。将查询DSL视为查询的AST(抽象语法树),它由两种子句组成:
- 叶子查询子句
叶子查询子句 在特定域中寻找特定的值,如 match,term或 range查询 - 复合查询子句
复合查询子句包装其他叶子查询或复合查询,并用于以逻辑方式组合多个查询(例如 bool或dis_max查询),或更改其行为(例如 constant_score查询)。
我们在使用ElasticSearch的时候,避免不了使用DSL语句去查询,就像使用关系型数据库的时候要学会SQL语法一样。如果我们学习好了DSL语法的使用,那么在日后使用和使用Java Client调用时候也会变得非常简单。
基本语法:
POST /索引库名/_search {
"query":{ "查询类型":{ "查询条件":"查询条件值" } } }
这里的query代表一个查询对象,里面可以有不同的查询属性
- 查询类型:
例如: match_all , match , term , range 等等 - 查询条件:
查询条件会根据类型的不同,写法也有差异,后面详细讲解
查询所有(match_all query)示例:
POST /lagou-company-index/_search {
"query":{ "match_all": {} } }
- query :代表查询对象
- match_all :代表查询所有
结果:
- took:查询花费时间,单位是毫秒
- time_out:是否超时
- _shards:分片信息
- hits:搜索结果总览对象
total:搜索到的总条数
max_score:所有结果中文档得分的最高分
hits:搜索结果的文档对象数组,每个元素是一条搜索到的文档信息 - _index:索引库
- _type:文档类型
- _id:文档id
- _score:文档得分
- _source:文档的源数据
总结
以上就是对ES的基础和高级应用介绍,不出意外的话下期介绍企业级高可用分布式集群和数据模型构建。我是油条~下期见!