ElasticSearch 小白入门
1.数据概述
1.1 数据类型
数据分为结构化数据和非结构化数据。结构化数据指的是长度固定或格式固定,例如数据库等。一般存储在Mysql或Oracle中,可通过建立索引实现快速的查询;非结构化数据指的是全文数据,长度和格式都不固定,例如文档等。一般通过顺序扫描或全文搜索实现数据的查询。
1.2 数据搜索技术
1.2.1 顺序扫描
根据给定的查询条件,依次遍历所有的数据,将符合条件的数据筛选出来。但在大数据量的情况下,效率非常低。
1.2.2 全文搜索
为了解决顺序扫描的效率低问题,考虑从非结构化数据中提取一些字段信息,作为整体数据的简要说明,类似于文章标签和关键词这种,提取出的字段信息就变成了结构化数据,作为原始数据的索引,从而提高查询的速度。
1.2.3 全文搜索引擎
全文搜索引擎是全文搜索技术的具体实现。基本原理:通过扫描索引中的每一个字段数据,对字段数据进行分词,形成词条,记录每个词条在字段数据中出现的次数和位置。当用户检索时,可通过词条索引快速查数据。例如:每本书籍都会有目录,目录就是索引,通过目录可快速定位到查找的地方。常见搜索引擎:Lucene, Elastic Search以及Solr。
1.3 数据库和全文搜索引擎的讨论
疑问:为什么有了Mysql等类型的数据库做全文搜索?
主要基于几个方面的考虑:
- 数据类型。ES可以更好的支持非结构化数据的存储和查询;
- 搜索性能。数据量达到千万级别后,使用Mysql存储查询文本数据的话,会查询全部数据,内存和时间消耗非常大。例如:查询name中包含‘he’的字段,Mysql存储引擎会查询全部的数据。
- 搜索灵活度。比如搜索过程中能够提示和相似度搜索。
- 索引维护。Mysql存储文本的话,一方面SQL索引的优化收效甚微,另一方面insert和update会造成索引的整体更新。
全文搜索的适用场景:
- 搜索对象是大量非结构Text数据;
- 整体数据量达到百万及以上;
- 搜索灵活度高
1.4 Elastic Search和Solr对比
Lucene是一个Java全文搜索引擎,提供搜索代码库和API,但不是完整的应用程序。Solr和ES是在Luence基础上构建的交互友好以及高级功能的全文搜索引擎。
区别:
- 分布式能力:ES自带分布式协调管理功能; Solr使用Zookeeper实现分布式管理;
- 搜索格式:ES仅支持Json格式; Solr支持Json, Xml以及Csv;
- 社区活跃度:Solr相对比较成熟;ES发展速度快;
- 查询性能:
- ES在实时搜索场景下,查询速度更快,更加适合实时搜索场景,比如日志查询,监控指标分析以及推荐系统等。
- Solr在普通场景下,查询速度更快, 但出现索引更新时查询速度慢。适合传统搜索应用场景,比如电子商务、内容管理、数据聚合等需要强大的搜索和聚合功能的场景。
补充:实时搜索指的是索引刚建立或更更新完,就进行查询。由于Solr建立索引时会产生IO阻塞,此时查询性能比较差
2.ES基础概念
名词名称 | 名词含义 | Mysql中的名词 |
---|---|---|
索引Index | 存储文本数据的地方 | 类似于数据库 |
类型Type | 一类数据集合的总称。ES7移除了Type的概念 | 类似于表 |
映射Mapping | 定义了每个字段的类型信息 | 类似于数据库中的表结构 |
文档Document | 一行记录 | 类似于表中的一条数据 |
字段Field | 数据字段 | 类似于表中的字段 |
集群Cluster | 一个或多个节点组成,一个集群默认有一个默认名称"elasticsearch" | 暂无 |
节点Node | 集群中的节点, 一台机器或一个进程 | 暂无 |
分片和副本Shard | 见图片 | 暂无 |
分片和副本之间的联系:
分片指的是一个独立索引,包含一个完整的数据子集,主要为了实现数据的分布式存储和处理,以提高性能和可扩展性。分为主分片和副本分片,主分片负责索引搜索和写请求;副本分片是主分片的完全复制,负责数据的读请求,用于提供数据的冗余和高可用性。一方面实现读写分离,另一方面主分片出现故障时,副本分片自动升级为主分片,实现故障的自动转移,提高高可用性。