Elasticsearch功能介绍
Elasticsearch是什么?
ElasticSearch是一个基于Lucene的高可用、高可扩展的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。
Lucene是apache软件基金会的一个子项目,是一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。
能做什么/为什么要用es?
搜索
全文检索、评分、倒排索引。可以用于电商网站、门户网站、企业IT系统等各种场景下的搜索引擎,也可以用于对海量的数据进行近实时的数据分析。
- ElasticSearch在GitHub上提供搜索,包括20亿个文档件和8百万代码库
- 七牛云–基于Elasticsearch构建千亿流量日志搜索平台实战
- stack overflow、uber、 LinkeDin、 Wikipedia、FaceBook、新浪
可适用于任何需要搜索功能的地方,代替关系行数据库like的不足。es索引是基于内存的高效处理。
日志分析
分析和挖掘这些数据,寻找趋势,统计,总结,或异常。
kibana是elasticsearch的一个可视化插件。日志分析处理可用logstash+elasticsearch+kibana来进行日志的搜集、存储、分析展示,这三个软件在es官网都有提供。
kibana功能列表
处理地理数据
可用于基于经纬度范围查询,电子围栏(指定图形边界坐标,查找该范围内的所有坐标点)。
搜索自动补全
拼音搜索
// 拼音搜索"北京一日游"
GET /travel_content-*/_search
{
"query": {
"term": {
"title.pinyin": {
"value": "bjyry"
}
}
}
}
搜索结果:
机器学习
es 提供了基于时序的数据预测,同时提供了对异常数据通过email、webhook等方式进行推送,开箱即用,很适合基于时序的数据预测。
基本概念
集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有你全部的数据, 并一起提供索引和搜索功能。一个集群由一个唯一的名字标识, 这个名字默认就是“elasticsearch”。
节点(node)
一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。 默认情况下,如果在网络中启动了若干个节点, 并假定它们能够相互发现彼此,它们将会自动地形成并加入到集群中。
节点类型
- Master: 候选主节点,有机会被选举为控制集群的主节点,
创建、删除索引,分配分片,主节点选举过程 - Ingest: 摄取节点,对文档进行索引之前做预处理
- Data: 数据节点,执行数据相关的操作,包括搜索/聚合/CRUD
- Machine learning: 机器学习节点,专门用于机器学习
- Coordinate node 协调节点是一种角色,不是真正的物理节点。一个节点只作为接收请求、转发请求到其他节点、汇总各个节点返回数据等功能的节点,每个节点都是协调节点,可以关闭某一节点的数据存储、master选举功能来作为专门的协调节点。
在一个集群里可以拥有任意多个节点。
索引(index)
一个索引就是一个拥有相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来 标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,你能够创建任意多个索引。
类型(type)
es 7.0版本前,在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组相同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台 并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
7.0之后已经不建议指定类型.
文档(document)
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档、某一个产品的一个文档、某个订单的一个文档。文档以JSON格式来表示,而JSON是一个到处存在的互联网数据交互格式。
分片(shard)
一个分片就是一个lucene实例,是一个完整的搜索引擎。一个索引中的分片会均匀的分布在各data节点上,因此,分片有助于横向扩展(增加机器)。
段(segment)
elasticsearch中的每个分片包含多个segment,每一个segment都是一个倒排索引;在查询的时,会把所有的segment查询结果汇总归并后最为最终的分片查询结果返回;
副本(replica)
副本是针对索引设置的,一个索引可以设置多个副本,可以动态增加、删除副本,副本具有和主索引完全一样的数据。副本建立后,会均匀的分布在集群的各个节点上,为数据容灾提供保证。
图中有一个主分片,两个副本分片,分别分布到了三个节点上。任意两个节点故障,都可以从另一个节点来进行恢复。
搜索基础
搜索基础—倒排索引
- 原始文档
- 建立倒排索引
如何进行全文索引的
分析器进行分析,分词/过滤
一旦组成了词项列表,这个查询会对每个词项逐一执行底层的查询,再将结果合并,然后为每个文档生成一个最终的相关度评分。
相关度评分
Lucene(或 Elasticsearch)使用布尔模型(Boolean model) 查找匹配文档, 并用一个名为实用评分函数(practical scoring function) 的公式来计算相关度。这个公式借鉴了 词频/逆向文档频率(term frequency/inverse document frequency) 和 向量空间模型(vector space model),同时也加入了一些现代的新特性,如协调因子(coordination factor),字段长度归一化(field length normalization),以及词或查询语句权重提升。
分析器
支持多种语言分析器,中文是以插件的形式来提供支持(ik分析器),有通用的standard分析器。
快速定位存储位置
shard = hash(routing) % number_of_primary_shards
routing:文档id
从原理到应用,Elasticsearch详解
Elasticsearch 优势
- 近实时
- 生态圈发展很好
- 分布式,横向扩展简单,增加机器。
- 高可用,设置副本分片使某台机器宕机的时候任可正常运行。
Elasticsearch 特点
- 单个索引的大小可以不受的节点存储限制,文档可以储存在一个或多个节点中
- 按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡
- 复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失
- 将集群中任一节点的请求路由到存有相关数据的节点
- 集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复
如何使用?
linux 安装部署
- 编写shell安装脚本
- ansible 配置跨节点安装
- supervisor 保活
原生dsl查询
sql 查询 elasticsearch
配置优化
写入优化
- 写入时,关闭副本
- 延长持久化时间间隔
refresh_interval:5s
- 足够的内存
- 更快的硬盘,比如ssd.
查询优化
- 在查询是需要查多个字段时,可以在写入的时候设置coop_to mapping 将多个字段自动写到同一个新的字段,查询的时候查新的这个字段。
- 对常用的range索引,添加新字段进行存储,以使用term聚合。如:
GET test/_search
{
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 10 },
{ "from": 10, "to": 100 },
{ "from": 100 }
]
}
}
}
}
可改为:
PUT index/_doc/1
{
"designation": "spoon",
"price": 13,
"price_range": "10-100" # 提前计算好范围
}
- 将不需要range范围查询的数值类型改为keyword,查询更快。
- 搜索日期尽量避免now,不可缓存。
- 将不再改变的索引的segment合并成更大的端,提高搜索性能。
提前设计
- 索引别名
- 分片设计
- 副本设计
- 基于时间序列的数据存储技巧
按时间创建索引,刚开始你可能一个月才需要创建一个索引,但是到后面,你一天就需要创建一个索引,这样就变得很简单。 - 索引模版
相同类型的数据不需要重新设计mapping
es周边
- kibana es配套的可视化展示工具
- logstash 数据导入、预处理工具,提供输入、过滤、输出功能
- filebeat 日志收集工具,可配合logstash一起使用
- sql 客户端
- restful 调用
- 特有的json格式的dsl查询
其他
相关文档
- 官方文档
- 简单理解倒排索引
- Elasticsearch基本概念
- Elasticsearch学习笔记
- Elasticsearch拼音搜索插件
- These 15 Tech Companies Chose the ELK Stack Over Proprietary Logging Software