文章目录

  • 前言
  • 一、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. 特点

  1. 安装方便:没有其他依赖,下载后安装非常方便;只用修改几个参数就可以搭建起来一个集群
  2. JSON:输入/输出格式为 JSON,意味着不需要定义 Schema,快捷方便
  3. RESTful:基本所有操作 ( 索引、查询、甚至是配置 ) 都可以通过 HTTP 接口进行
  4. 分布式:节点对外表现对等(每个节点都可以用来做入口) 加入节点自动负载均衡
  5. 多租户:可根据不同的用途分索引,可以同时操作多个索引
  6. 支持超大数据: 可以扩展到 PB 级的结构化和非结构化数据
  7. 海量数据的近实时处理

4. 企业使用场景

  1. 搜索类场景
    比如说电商网站、招聘网站、新闻资讯类网站、各种app内的搜索。
  2. 日志分析类场景
    经典的ELK组合(Elasticsearch/Logstash/Kibana),可以完成日志收集,日志存储,日志分析查询界面基本功能,目前该方案的实现很普及,大部分企业日志分析系统使用了该方案。
  3. 数据预警平台及数据分析场景
    例如电商价格预警,在支持的电商平台设置价格预警,当优惠的价格低于某个值时,触发通知消息,通知用户购买。
    数据分析常见的比如分析电商平台销售量top 10的品牌,分析博客系统、头条网站top 10关注度、评论数、访问量的内容等等。
  4. 商业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的基础和高级应用介绍,不出意外的话下期介绍企业级高可用分布式集群和数据模型构建。我是油条~下期见!