0.elasticsearch介绍
Posted PacosonSWJTU
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0.elasticsearch介绍相关的知识,希望对你有一定的参考价值。
【README】
1.本文部分内容总结自 Elasticsearch introduction | Elasticsearch Guide [7.2] | Elastic
2.elasticsearch 是一个数据存储,检索和分析引擎;
- 存储:文档的增加删除修改功能,api如 put/post/delete
- 检索:文档的搜索功能,如query dsl;
- 分析:文档聚合统计功能,如aggregation;
3.elasticsearch与mysql间的数据存储方式对比
序号 | Es | Mysql |
1 | 索引 | 数据库 |
2 | 类型 | 数据表 |
3 | 文档 | 数据行 |
【注意】
- es6.0 已经移除了type类型;
- 个人理解:可以把es索引看做mysql的数据库表,文档看做myql的数据行;
4.文末还po出了 _cat api;
【1】elasticsearch 概述
1)elasticsearch 是Elastic Stack核心中的分布式搜索和分析引擎。
- elasticsearch用于 索引,搜索,分析发生的场景。
2)elasticsearch提供了对所有类型数据的实时搜索与分析能力
- 无论你有结构化或非结构化数据,数值数据,或地理位置数据,elasticsearch都能够以一种有效搜索方式提供存储和索引功能。
3)虽然不是每个问题都是搜索问题,但elasticsearch 提供了速度和灵活性来处理各种用例中的数据
- 为一个app或网站添加搜索框;
- 搜索与分析日志,指标,以及安全事件数据;
- 使用机器学习技术对用户行为进行实时自动化建模;
- 使用 elasticsearch 作为存储引擎自动化业务工作流;
- 使用 elasticsearch 作为地理信息系统管理,基础和分析空间信息;
- 使用elasticsearch作为生物信息学研究工具来存储和处理遗传数据;
【2】数据存储:文档与索引
1)elasticsearch 是一个分布式文档存储系统。
- 不是把数据存储为列式数据行,elasticsearch把复杂数据结构序列化为 json文档 进行存储;
- 当 elasticsearch集群中有多个节点时,存储的文档会分布在集群节点;且可以在任何一个节点访问;
2)当文档被存储后,其可以近实时地(1秒内)被索引和搜索;
- elasticsearch使用一种被称为倒排索引的数据结构,以支持非常快速的全文搜索;;
- 一个倒排索引罗列了文档中出现的每一个独特的单词,并标识出每个单词出现的所有文档;
3)一个索引被认为是文档被优化后的集合,每个文档是字段集合,字段是包含数据的kv键值对
- 默认地,elasticsearch 对每个字段的所有数据建立索引,且每个索引过的字段都有一个专用的优化数据结构。
- 如 文本字段存储在倒排索引中,数值和地理字段存储在 BKD树中;
- elasticsearch之所为如此快速的原因在于: 使用每个字段数据结构进行组装和返回搜索结果的能力;
4)elasticsearch 还具有无模式能力(schema-less),这意味着文档被建立索引时不需要显式指定如何处理每个可能出现在文档中的不同字段;
- 当开启了动态映射能力,elasticsearch 自动识别并添加新字段到索引中;这种默认行为使得索引和搜索数据变得简单;
- 仅仅是为文档建立索引,elasticsearch就会探测和映射布尔型,浮点型和整型,日期,字符串到合适的es数据类型;
5)当然了,你可以定义规则控制动态映射和显式定义映射以完全控制字段如何被存储和索引。定义自己的映射使你能够:
- 区分开 全文(full-text)字符串字段和精确值(keyword)字符串字段;
- 执行特定语言的文本分析;
- 优化字段以进行部分匹配;
- 使用自定义日期格式;
- 使用数据类型如 geo_point 和 geo_shape 这些不能被自动探测的字段;
【3】信息输出: 搜索和分析
1)elasticsearch真正的强大在于:
- 能够轻松访问基于 apache lucene 搜索引擎构建的全套搜索功能;
2)elasticsearch提供了一个简单,连贯的rest api,用于管理集群,索引和搜索数据。
- 出于测试目的,你可以简单从命令行提交请求,或通过Kibana;
- 在应用程序方面,你可以根据你的语言使用 elasticsearch client,如 java,javascript,go等;
【3.1】搜索数据
1)elasticsearch rest api支持 结构化查询,全文查询,以及包含两者的复杂查询;
- 方式1:结构化查询:与 通过SQL构建的查询类似;
- 方式2:全文查询:找出所有匹配查询字符串的所有文档,并根据相关性评分排序返回结果;
补充:相关性评分指的是 一个文档匹配搜索词条的匹配程度;
2)除了搜索单个条目,你也可以执行短语搜索,相关性搜索,前缀搜索,及获得自动完成建议;
3)elasticsearch 在支持高性能地理和数字查询的优化数据结构中索引非文本数据;
4)你可以使用elasticsearch综合的 json风格的查询语言(query dsl)来访问这些所有搜索功能;
5)你还可以构建sql风格的查询语句以搜索和聚合elasticsearch本地数据;
- 而 JDBC 和 ODBC 驱动程序使第三方应用程序能够通过sql 与 elasticsearch 进行交互;
补充:
- query dsl 参见 Query DSL | Elasticsearch Guide [7.2] | Elastic
- sql样式的查询语句: 参见 Overview | Elasticsearch Guide [7.2] | Elastic
【3.2】分析数据
1)elasticsearch 聚合功能使得你可以构建对数据的复杂统计并深入了解关键指标,模式与趋势。
2)聚合可以让你回答以下问题:
- 大海捞针有多少?
- 针的平均长度是多少?
- 针的中位长度是多少,按制造商细分?
- 在过去的六个月中,每年有多少针被添加到大海捞针中?
3)因为聚合利用了相同数据结构用于搜索,所以它非常快;
4)更重要的是 :聚合与搜索请求可以一起执行。
- 你可以在同一个请求里,对相同的数据,同时进行 搜索文档,过滤结果,执行分析等多种操作;
【4】可扩展性与弹性:集群,节点与分片
1)elasticsearch旨在始终可用并按需扩展,它通过分布式 特性做到这一点;
- 你可以添加服务器(节点)到集群以增加容量(性能);然后elasticsearch自动把数据和查询负载分布到所有可用节点上;
- Elasticsearch 知道如何平衡多节点集群以提供可扩展性和高可用性。 节点越多越好。
2)elasticsearch集群如何工作?
- 一个elasticsearch索引实际上仅仅是由一个或多个物理分片的逻辑分组,其中每个物理分片实际上是一个自包含索引;
- 通过把一个索引的所有文档分布到多个分片,并将这些分片分布到多个节点上,elasticsearch保证了数据冗余存储,这防止了硬件损坏且增加了查询能力,随着节点添加到集群;
- 随着集群增长,elasticsearch 自动迁移分片使得集群重新平衡;
3)elasticsearch集群分片
- 主要有两种分片,包括 主要分片与副本分片;
- 索引中的每个文档都属于一个主要分片。
- 一个副本分片是主要分片的拷贝;
- 副本分片提供数据的冗余存储以防止硬件故障并增加了处理读请求的能力,如搜索文档;
主要分片数量在索引创建时就固定了,但副本分片的数量随时可以修改,且不会干扰索引和查询操作;
4)性能考量
- 关于分片数量和主分片数量,有许多性能考量与权衡;
- 分片数越多,维护成本越大;
- 单个分片容量越大,elasticsearch就需要更长的时间来移动分片以重新平衡集群;
5)分片大小:
- 旨在将平均分片大小保持在几 GB 到几十 GB 之间。 对于具有基于时间的数据的用例,通常会看到 20GB 到 40GB 范围内的分片。
- 避免大量碎片问题。 一个节点可以容纳的分片数量与可用的堆空间成正比。 作为一般规则,每 GB 堆空间的分片数应小于 20。
补充: 为您的用例确定最佳配置的最佳方法是使用您自己的数据和查询进行测试。
【5】_cat api
- Get /_cat/nodes : 查看所有节点;
- Get /_cat/health : 查看es健康状况;
- Get /_cat/master : 查看主节点;
- Get /_cat/indices : 查看所有索引 ; 类似于 show databases;
以上是关于0.elasticsearch介绍的主要内容,如果未能解决你的问题,请参考以下文章