零、 什么是 Elastic Search
ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式的全文搜索引 擎,其对外服务是基于 RESTful web 接口发布的。Elasticsearch 是用 Java 开发的应用, 并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云 计算中,能够达到近实时搜索,稳定,可靠,快速,安装使用方便。
1 相关概念
1.1 cluster
集群。ElasticSearch 集群由一或多个节点组成,其中有一个主节点,这个主节点是可 以通过选举产生的,主从节点是对于集群内部来说的。ElasticSearch 的一个概念就是去中 心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部看 ElasticSearch 集群,在逻辑上是个整体,你与集群中的任何一个节点通信和与整个 ElasticSearch 集群通 信是等价的。也就是说,主节点的存在不会产生单点安全隐患、并发访问瓶颈等问题。
1.2 shards
primary shard:代表索引的主分片,ElasticSearch 可以把一个完整的索引分成多个 primary shard,这样的好处是可以把一个大的索引拆分成多个分片,分布存储在不同的 ElasticSearch 节点上,从而形成分布式存储,并为搜索访问提供分布式服务,提高并发处 理能。primary shard 的数量只能在索引创建时指定,并且索引创建后不能再更改 primary shard 数量。
1.3 replicas
replica shard:代表索引主分片的副本,ElasticSearch 可以设置多个 replica shard。 replica shard 的作用:一是提高系统的容错性,当某个节点某个 primary shard 损坏或丢 失时可以从副本中恢复。二是提高 ElasticSearch 的查询效率,ElasticSearch 会自动对搜 索请求进行负载均衡,将并发的搜索请求发送给合适的节点,增强并发处理能力。
1.4 Index
索引。相当于关系型数据库中的表。其中存储若干相似结构的 Document 数据。如:客户索引,订单索引,商品索引等。ElasticSearch 中的索引不像数据库表格一样有强制的 数据结构约束,在理论上,可以存储任意结构的数据。但了为更好的为业务提供搜索数据支 撑,还是要设计合适的索引体系来存储不同的数据。
1.5 Type
类型。每个索引中都必须有唯一的一个 Type,Type 是 Index 中的一个逻辑分类。 ElasticSearch 中的数据 Document 是存储在索引下的 Type 中的。
注 意 : ElasticSearch5.x 及 更 低 版 本 中 , 一 个 Index 中 可 以 有 多 个 Type 。 ElasticSearch6.x 版本之后,type 概念被弱化,一个 index 中只能有唯一的一个 type。 且在 7.x 版本之后,删除 type 定义。
1.6 Document
文档。ElasticSearch 中的最小数据单元。一个 Document 就是一条数据,一般使用 JSON数据结构表示。每个Index下的Type中都可以存储多个Document。一个Document 中可定义多个 field,field 就是数据字段。如:学生数据({“name”:“张三”, “age”:20, “gender”:“男”})。
1.7 反向索引|倒排索引
对数据进行分析,抽取出数据中的词条,以词条作为 key,对应数据的存储位置作为 value,实现索引的存储。这种索引称为倒排索引。倒排索引是Document写入ElasticSearch 时分析维护的。
如:
2 ElasticSearch 常见使用场景
维基百科:全文检索,高亮显示,搜索推荐
The Guardian(国外的一个新闻网站),此平台可以对用户的行为(点击、浏览、收 藏、评论)、
社区网络数据(对新闻的评论等)进行数据分析,为新闻的发布者提供相关的 公众反馈。
Stack Overflow(国外的程序异常讨论论坛)
Github(开源代码管理),在千亿级别的代码行中搜索信息
电子商务平台等。
3 为什么不用数据库做搜索?
3.1 查询语法复杂度高。
如:电商系统中搜索商品数据 - select * from products where name like ‘%关键 字%’ and price bewteen xxx and yyy and …。不同的用户提供的查询条件不同,需要提 供的动态 SQL 过于复杂。
like 数据库不建立索引,慢
3.2 关键字索引不全面,搜索结果不符合要求
如:电商系统中查询商品数据,条件为商品名包含’笔记本电脑’。那么对此关键字的分 析结果为-笔记本、电脑、笔记等。对应的查询语法应该为 - select * from products where name like ‘%笔记本%’ or name like ‘%电脑%’ …
关键字搜索数据不全面
3.3 效率问题
数据量越大,查询反应效率越低。
mysql是百万级别数据库,数据量越大越慢。