我们正处于一个信息过载的时代,有用的信息、无用的信息夹杂在一起。
创新互联建站服务项目包括喀喇沁网站建设、喀喇沁网站制作、喀喇沁网页制作以及喀喇沁网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,喀喇沁网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到喀喇沁省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
我们有从海量信息中获取数据的诉求,搜索和推荐就是两个有效的工具。
ChatGPT本质上说是一种更加高效准确的获取信息的渠道,至少对于我来说,有效减少了从传统搜索引擎众多结果中过滤有效信息的成本。
曾几何时,搜索引擎也是技术壁垒较深的一个领域,像谷歌、百度等老牌网页搜索引擎公司,就靠着搜索和广告赚得盆满钵满。
时间拉到现在,各类app层出不穷,搜索不再均限于网页,更多的是app内的垂直领域检索,像小红书、知乎、淘宝、拼多多都是如此。
再具体到一些我们日常的业务场景,也同样有检索诉求:筛选检索和模糊检索。
以常用的找房app为例,可以输入商圈名称、小区名称,当然这些都不需要非常具体,检索框就可以进行提示,同时还可以根据具体的条件做筛选,比如面积、朝向、总价等。
这些都可以用es来实现,再有上层的排序逻辑,基本上就可以实现面向用户的检索功能了。
在聊es之前,就必须要提lucene,如果把es看做是豪车,lucene则是这辆豪车的发动机,真可谓是es的核心部件。
Luene是一款高性能、可扩展的信息检索库,用于完成文档元信息、文档内容等搜索功能。
用户可以使用Lucene来快速构建搜索服务,如文件搜索、网页搜索等,它是一个索引和搜索库,不包含爬取和HTML解析功能。
1985年 Doug Cutting毕业于美国斯坦福大学,在1999年编写了Lucene,他是一位资深的全文索引及检索专家,曾经是V-Twin搜索引擎的主要开发者,后来在Excite担任高级系统架构设计师,目前从事于一些互联网底层架构的研究。
值得一提的是,Doug Cutting还是大名鼎鼎的Hadoop之父,大牛果然是高产。
有了Lucene之后,那么es又是怎么诞生的呢?这就要提到一个曾经的待业青年 Shay Banon。
当年他还是一个待业工程师,跟随自己的新婚妻子来到伦敦,妻子想在伦敦学习做一名厨师,而自己则想为妻子开发一个方便搜索菜谱的应用,所以才接触到 Lucene。
直接使用 Lucene 构建搜索有很多问题,包含大量重复性的工作,所以 Shay Banon 便在 Lucene 的基础上不断地进行抽象,让 Java 程序嵌入搜索变得更容易,经过一段时间的打磨便诞生了他的第一个开源作品Compass。
之后,他找到了一份面对高性能分布式开发环境的新工作,在工作中他渐渐发现越来越需要一个易用的、高性能、实时、分布式搜索服务,于是决定重写 Compass,将它从一个库打造成了一个独立的 server,并创建了开源项目。
第一个公开版本出现在 2010 年 2 月,在那之后 Elasticsearch 已经成为 Github 上最受欢迎的项目之一。
后来和几个志同道合的技术狂人一起把es做大做强,最后敲钟上市,从待业青年成为了亿万富翁,还真是励志!
我们前面提到,es是基于Lucene打造的开源检索组件,Lucene只是一个裸信息检索库,而es要做的就是解决Lucene到业务场景的最后一公里问题。
当我们尝试去学习一个组件时,不妨把我们自己当做组件的研发者,抱着去做一款产品的思维来看,或许可以更清晰。
在聊es的架构和原理之前,我们也反客为主去思考下,es的目标有哪些:
要解决海量数据检索、高并发、高可用等问题,就必须要引入分布式系统,集群模式下吞吐量和稳定性都能有保证。
在es集群中每台机器从不同角度看有不同的角色,其中重要的几个包括:
再细分的角色还有很多,在此不展开了,实际上分布式系统中各个节点的角色和要做的事情,基本都差不多,和人类社会运行中的各个角色都非常相似。
引入分布式系统之后,就会面临很多新的问题:网络延迟、消息丢失、集群脑裂、故障容错和恢复、一致性、共识问题、选举问题、等。
分布式系统也是一把双刃剑,但是其带来的好处遇大于问题,在分布式基础理论和基础算法的加持下,让分布式系统应用于生产实践成为了现实。
基于分布式系统,es存储的数据会进行分割和备份,也就是我们常说的分片和副本。
如图所示,Data-A和Data-B分割为两个分片shard,每个shard有1个主分片2个副本分片,这12块数据被交错无重复地分配到4台机器上:
这种分配模式可以有效降低机器故障带来的数据丢失风险,副本数增加也提升了读的并发量。
ES的任意节点都可以作为协调节点(coordinating node)接受请求,当协调节点接受到请求后进行一系列处理,然后通过_routing字段找到对应的主分片primary shard,并将请求转发给primary shard。
一种常用的路由算法是:
shard_id = hash(doc_id)%num_of_primary_shard
primary shard完成写入后,将写入并发发送给各replica, raplica执行写入操作后返回给primary shard, primary shard再将请求返回给协调节点。
主分片primary shard与副本分片replica之间的同步,有两种模式:
- 同步复制,需要所有副本分片全部写入才可以
- 异步复制,只有一半以上的副本完成写入即可
倒排索引(Inverted Index)是通过value找key,这是全文检索的关键,但是大文本数据使用B+树作为底层存储容易造成树深度增加,IO次数增加等问题,因此es的倒排索引采用了另外一种结构:
说明写入细节之前,有几个概念需要对齐:
es写入的数据最先放到内存中,再做一系列的操作写到磁盘中
内存缓冲区(memory buffer)和文件系统缓存区(file system cache),这是两种的内存区域,目的是为了提高写入的速度,作为写入磁盘前的缓冲地带,但是buffer和cache并不是同一个东西。
refresh就是将buffer中的数据写入cache的过程,flush就是将内存中的数据刷到磁盘的过程。
接下来,我们来看下写入的详细过程:
// 设置控制内存缓冲区刷新到磁盘的频率
index.translog.sync_interval = 5s
index.translog.flush_threshold_size = 512MB
index.translog.flush_threshold_period = 30min
再对整个过程做下总结:
在网上看到了另外一张图,更清晰一些:
es的Search操作分为两个阶段:query then fetch。
需要两阶段完成搜索的原因是:在查询时不知道文档位于哪个分片,因此索引的所有分片都要参与搜索,然后协调节点将结果合并,在根据文档ID获取文档内容。
当前标题:浅谈ElasticSearch的那些事儿
URL链接:http://www.shufengxianlan.com/qtweb/news20/219320.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联