Elasticsearch
一、概述
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储数据,快速完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。
二、应用场景
数字、文本、地理位置、结构化数据、非结构化数据。适用于所有数据类型。全文本搜索只是全球众多公司利用 Elasticsearch 解决各种挑战的冰山一角。查看直接依托 Elastic Stack 所构建解决方案的完整列表。
三、功能
Elasticsearch 是一个分布式的 RESTful 搜索和分析引擎,可用来集中存储数据,以便您对形形色色、规模不一的数据进行搜索、索引和分析。
3.1 管理和运行
可扩展性和弹性 | 安全性 | 客户端 | 集成 |
---|---|---|---|
聚类和高可用性 | Elasticsearch 安全设定 | 语言客户端 | Elasticsearch-Hadoop |
自动节点恢复 | 加密通信 | Elasticsearch DSL | Apache Hive |
自动数据再平衡 | 数据静态加密支持 | Elasticsearch SQL | Apache Pig |
水平可扩展性 | 基于角色的访问控制 (RBAC) | 事件查询语言 (EQL) | Apache Spark |
机架意识 | 基于属性的访问控制 (ABAC) | JDBC 客户端 | Apache Storm |
跨集群复制 | 字段和文档级别安全性 | ODBC 客户端 | 商业智能 (BI) |
跨数据中心复制 | 审计日志 | 面向 Elasticsearch 的 Tableau 连接器 | 插件和集成 |
管理 | IP 筛选 | CLI 工具 | 部署 |
– | – | – | – |
从快照恢复 | Security Realm | REST API | 下载并安装 |
索引生命周期管理 | 单点登录 (SSO) | 文档 API | Elastic Cloud |
数据层 | 第三方安全性集成 | 搜索 API | Elastic Cloud Enterprise |
快照生命周期管理 | Alerting | 聚合 API | Elastic Cloud on Kubernetes |
快照和还原 | 高可用性、可扩展警报 | 采集 API | Helm Charts |
可搜索快照 | 通过电子邮件、Webhook、IBM Resilient、Jira、Microsoft Teams、PagerDuty、ServiceNow、Slack 和 xMatters 传送的通知 | 管理 API | Docker 容器化 |
数据汇总 | |||
数据流 | |||
Transforms | |||
升级助手 API | |||
API 密钥管理 |
3.2 采集和扩充
数据采集 |
---|
客户端和 API |
采集节点 |
Beats |
Logstash |
社区贡献的采集器 |
数据扩充 |
Elastic Common Schema |
处理器 |
分析器 |
分词器 |
筛选 |
语言分析器 |
动态映射 |
Match enrich 处理器 |
Geo-match enrich 处理器 |
3.3 数据存储
灵活性 |
---|
数据类型 |
全文本搜索(倒排索引) |
文档存储库(针对非结构化数据) |
时序/分析(列式存储库) |
地理空间(BKD 树) |
安全性 |
---|
字段级和文档级 API 安全性 |
数据静态加密支持 |
管理 |
---|
集群式索引 |
数据快照和还原 |
汇总索引 |
3.4 搜索和分析
全文本搜索 |
---|
倒排索引 |
运行时字段 |
查找运行时字段 |
跨集群搜索 |
相关性评分 |
矢量搜索 (ANN) |
查询 DSL |
非同步搜索 |
Highlighter |
自动补全 (auto-complete) |
提示器 (did-you-mean) |
更正(拼写检查) |
Percolator |
查询剖析器/优化器 |
基于许可的搜索结果 |
动态可更新同义词 |
结果固定 |
分析 |
---|
聚合 |
Graph 探索 |
Machine Learning |
---|
时序型预测 |
时序型数据异常监测 |
异常情况警报 |
推理 |
语言识别 |
全文本搜索 |
---|
倒排索引 |
运行时字段 |
查找运行时字段 |
跨集群搜索 |
相关性评分 |
矢量搜索 (ANN) |
查询 DSL (Domain Specific Language) |
非同步搜索 |
Highlighter |
自动补全 (auto-complete) |
提示器 (did-you-mean) |
更正(拼写检查) |
Percolator |
查询剖析器/优化器 |
基于许可的搜索结果 |
动态可更新同义词 |
结果固定 |
分析 |
---|
聚合 |
Graph 探索 |
Machine Learning |
---|
时序型预测 |
时序型数据异常监测 |
异常情况警报 |
推理 |
语言识别 |
四、基本概念
索引(indices)-------------------Databases 数据库
类型(type)----------------------Table 数据表
文档(Document)---------------Row 行
字段(Field)---------------------Columns 列
概念 | 说明 |
---|---|
索引库(indices) | indices是index的复数,代表许多的索引, |
类型(type) | 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念 |
文档(document) | 存入索引库原始的数据。比如每一条商品信息,就是一个文档 |
字段(field) | 文档中的属性 |
映射配置(mappings) | 字段的数据类型、属性、是否索引、是否存储等特性 |
常见查询类型:
概念 | 说明 |
---|---|
查询所有 | 查询出所有数据,一般测试用。例如:match_all |
全文检索(full text)查询 | 利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:match_query,根据一个字段查询multi_match_query,根据多个字段查询,参与查询字段越多,查询性能越差 |
精确查询 | 根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。如:ids,range,根据值的范围查询,term,根据词条精确值查询 |
地理(geo)查询 | 根据经纬度查询。例如:geo_distance,查询到指定中心点小于某个距离值的所有文档,geo_bounding_box |
复合(compound)查询 | 复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:Bool,布尔查询是一个或多个查询子句的组合,其中包括must,should,must_not,filter,function_score,算分函数查询,可以控制文档相关性算分,控制文档排名 |
分页、深度分页 | elasticsearch 默认情况下只返回top10的数据。如果要查询更多数据,通过修改from、size参数来控制要返回的分页结果。例如:from + size,优点:支持随机翻页缺点:深度分页问题,默认查询上限(from + size)是10000;search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。优点:没有查询上限(单次查询的size不超过10000)缺点:只能向后逐页查询,不支持随机翻页;scroll:原理将排序数据形成快照,保存在内存。官方已经不推荐使用。优点:没有查询上限(单次查询的size不超过10000)缺点:会有额外内存消耗,并且搜索结果是非实时的 |
数据聚合:
参与聚合的字段类型必须是key,数值,日期,布尔
概念 | 说明 |
---|---|
桶(Bucket)聚合 | 用来对文档做分组,并统计每组数量。例如,TermAggregation:按照文档字段值分组;Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组 |
度量(Metric)聚合 | 用以计算一些值,比如:最大值、最小值、平均值等。例如,Avg:求平均值;Max:求最大值;Min:求最小值;Stats:同时求max、min、avg、sum等 |
管道(pipeline)聚合 | 其它聚合的结果为基础做聚合 |
桶聚合样例:
GET /hotel/_search
{
"query": {
"range": {
"price": {
"lte": 200 // 只对200元以下的文档聚合
}
}
},
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
}
}
}
}
aggs代表聚合,与query同级,此时query的作用是?
•限定聚合的的文档范围
聚合必须的三要素:
•聚合名称
•聚合类型
•聚合字段
聚合可配置属性有:
•size:指定聚合结果数量
•order:指定聚合结果排序方式
•field:指定聚合字段
度量样例:
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
},
"aggs": { // 是brands聚合的子聚合,也就是分组后对每组分别计算
"score_stats": { // 聚合名称
"stats": { // 聚合类型,这里stats可以计算min、max、avg等
"field": "score" // 聚合字段,这里是score
}
}
}
}
}
}
五、ELK和EFK
1.ELK
是Elasticsearch、Logstash、Kibana的开源软件的缩写。
2.EFK
是Elasticsearch、Filebeat、Kibana的开源软件的缩写。
3.容器中日志收集方案
方案一、Node节点上部署一个日志收集程序
优点:每个Node仅需部署一个日志收集程序,资源消耗少,对应用无入侵
缺点:应用程序日志需要写到标准输出和标准错误输出,不支持多行日志收集
方案二:Pod中附加专用日志收集的容器
优点:低耦合
缺点:每个Pod启动一个日志收集代理,增加资源消耗,并增加运维维护成本
方案三:应用程序直接推送日志
优点:无需额外收集工具
缺点:侵入应用,增加应用复杂度
文献参考:https://www.elastic.co/cn/elasticsearch/features/