## 一、什么是搜索? 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜欢的电影,或者说找一本喜欢的书,或者找一条感兴趣的新闻(提到搜索的第一印象) 垂直搜索(站内搜索) 互联网的搜索:电商网站,招聘网站,新闻网站,各种app IT系统的搜索:OA软件,办公自动化软件,会议管理,日程管理,项目管理,员工管理,搜索“张三”,“张三儿”,“张小三”;有个电商网站,卖家,后台管理系统,搜索“IPhone”,订单,“IPhone相关的订单” 搜索,就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你要搜索的关键字,然后就期望找到这个关键字相关的有些信息 ## 二、如果用数据库做搜索会怎么样? 做软件开发的话,或者对IT、计算机有一定的了解的话,都知道,数据都是存储在数据库里面的,比如说电商网站的商品信息,招聘网站的职位信息,新闻网站的新闻信息,等等吧。所以说,很自然的一点,如果说从技术的角度去考虑,如何实现如说,电商网站内部的搜索功能的话,就可以考虑,去使用数据库去进行搜索。 1、比方说,每条记录的指定字段的文本,可能会很长,比如说“商品描述”字段的长度,有长达数千个,甚至数万个字符,这个时候,每次都要对每条记录的所有文本进行扫描,懒判断说,你包不包含我指定的这个关键词(比如说“iphone 12”) 2、还不能将搜索词拆分开来,尽可能去搜索更多的符合你的期望的结果,比如输入“生化机”,就搜索不出来“生化危机” 用数据库来实现搜索,是不太靠谱的。通常来说,性能会很差的。 ## 三、什么是全文检索和Lucene? #### 1.什么是全文检索,倒排索引? 网上很多解释就不再赘述 #### 2.lucene 就是一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法。我们就用java开发的时候,引入lucene jar,然后基于lucene的api进行去进行开发就可以了。用lucene,我们就可以去将已有的数据建立索引,lucene会在本地磁盘上面,给我们组织索引的数据结构。 ## 四、什么是Elasticsearch? ![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0b9302f5543e4f1dab3ed0ab5c88fb7d~tplv-k3u1fbpfcp-watermark.image) ### ElasticSearch 核心概念 ### 1.Near Realtime(NRT) 近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级 ### 2.Cluster 集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常 ### 3.Node 节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群 ### 4\. Document&field 文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。 ### 5.Index 索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。 ### 6.Type(7.x后版本已删除) 类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。 ### 7.shard 单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。 ### 8.replica 任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。 ### 9.elasticsearch核心概念 vs. 数据库核心概念 | Elasticsearch | 数据库 | | --- | --- | | Document | 行 | | Type | 表 | | Index | 库 | ## 五、基础分布式架构 ![](data:image/svg+xml;utf8,) ### 1、Elasticsearch对复杂分布式机制的透明隐藏特性 ~~~ Elasticsearch是一套分布式的系统,分布式是为了应对大数据量 隐藏了复杂的分布式机制 分片机制:(我们之前随随便便就将一些document插入到es集群中去了,我们有没有care过数据怎么进行分片的,数据到哪个shard中去) cluster discovery:(集群发现机制,我们再次启动一个es进程,这个进程作为一个node自动就发现了集群,并且加入了进去,还接受了部分数据,replica shard) shard负载均衡:(举例,假设现在有3个节点,总共有25个shard要分配到3个节点上去,es会自动进行均匀分配,以保持每个节点的均衡的读写负载请求) shard副本: 请求路由,集群扩容,shard重分配 复制代码 ~~~ ### 2、Elasticsearch的垂直扩容与水平扩容 ~~~ 垂直扩容:采购更强大的服务器,成本非常高昂,而且会有瓶颈,假设世界上最强大的服务器容量就是10T,但是当你的总数据量达到5000T的时候,你要采购多少台最强大的服务器啊 水平扩容:业界经常采用的方案,采购越来越多的普通服务器,性能比较一般,但是很多普通服务器组织在一起,就能构成强大的计算和存储能力 普通服务器:1T,1万,100万 强大服务器:10T,50万,500万 扩容对应用程序的透明性 复制代码 ~~~ ### 3、增减或减少节点时的数据rebalance ~~~ 保持负载均衡 复制代码 ~~~ ### 4、master节点 ~~~ 1、创建或删除索引 2、增加或删除节点 复制代码 ~~~ ### 5、节点平等的分布式架构 ~~~ 1、节点对等,每个节点都能接收所有的请求 2、自动请求路由 3、响应收集 ~~~ 作者:Leo\_CX330 链接:https://juejin.cn/post/6908347505226809358 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。