网站域名后缀区别,南宁网站建设价格,网站建设过程中的网站设计怎么做,都江堰市建设局网站目录 1.ElasticSearch的简介 2.用数据库实现搜素的功能 3.ES的核心概念 3.1 NRT(Near Realtime)近实时 3.2 cluster集群#xff0c;ES是一个分布式的系统 3.3 Node节点#xff0c;就是集群中的一台服务器 3.4 index 索引#xff08;索引库#xff09; 3.5 type类型 3.6 doc… 目录 1.ElasticSearch的简介 2.用数据库实现搜素的功能 3.ES的核心概念 3.1 NRT(Near Realtime)近实时 3.2 cluster集群ES是一个分布式的系统 3.3 Node节点就是集群中的一台服务器 3.4 index 索引索引库 3.5 type类型 3.6 document文档 3.7 Field 字段 3.8 shard分片 3.9 relica副本 总结 4. ES集群的安装 4.1 下载 4.2 安装并启动ES 5. 安装 Kibana 5.1 为什么要安装 5.2 安装并启动 5.3 参数解析 6. ES的相关命令 7. ES的CURD操作 8.DSL语言 9.聚合分析 10.ES的隐藏性 11.ES集群的扩容问题 12.对等式架构 13.ES的primary shard和replica shard 14.ES的容错机制 15.自动生成ID号 16.version之悲观锁和乐观锁 1.ElasticSearch的简介 ElasticSearch智能搜索分布式的搜索引擎 是ELK的一个组成,是一个产品而且是非常完善的产品ELK代表的是E就是ElasticSearchL就是LogstachK就是kibana EEalsticSearch 搜索和分析的功能 LLogstach 搜集数据的功能类似于flume使用方法几乎跟flume一模一样是日志收集系统 KKibana 数据可视化分析可以用图表的方式来去展示文不如表表不如图是数据可视化平台 分析日志的用处假如一个分布式系统有 1000 台机器系统出现故障时我要看下日志还得一台一台登录上去查看是不是非常麻烦 但是如果日志接入了 ELK 系统就不一样。比如系统运行过程中突然出现了异常在日志中就能及时反馈日志进入 ELK 系统中我们直接在 Kibana 就能看到日志情况。如果再接入一些实时计算模块还能做实时报警功能。 这都依赖ES强大的反向索引功能这样我们根据关键字就能查询到关键的错误日志了。 什么是搜索 1百度谷歌必应。我们可以通过他们去搜索我们需要的东西。但是我们的搜索不只是包含这些还有京东站内搜索啊。 2互联网的搜索电商网站。招聘网站。新闻网站。各种APP百度外卖美团等等 3windows系统的搜索,OA软件淘宝SSM网站前后台的搜索功能 总结搜索无处不在。通过一些关键字给我们查询出来跟这些关键字相关的信息 什么是全文检索 全文检索是指计算机索引程序通过扫描文章中的每一个词对每一个词建立一个索引指明该词在文章中出现的次数和位置当用户查询时检索程序就根据事先建立的索引进行查找并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。 全文检索的方法主要分为按字检索和按词检索两种。按字检索是指对于文章中的每一个字都建立索引检索时将词分解为字的组合。对于各种不同的语言而言字有不同的含义比如英文中字与词实际上是合一的而中文中字与词有很大分别。按词检索指对文章中的词即语义单位建立索引检索时按词检索并且可以处理同义项等。英文等西方文字由于按照空白切分词因此实现上与按字处理类似添加同义处理也很容易。中文等东方文字则需要切分字词以达到按词索引的目的关于这方面的问题是当前全文检索技术尤其是中文全文检索技术中的难点在此不做详述。 什么是倒排索引 以前是根据ID查内容倒排索引之后是根据内容查ID然后再拿着ID去查询出来真正需要的东西。 什么是Lucene Lucene就是一个jar包里面包含了各种建立倒排索引的方法java开发的时候只需要导入这个jar包就可以开发了。 Lucene的介绍及使用 典型的用空间换时间。 ES 和 Lucene的区别 Lucene不是分布式的。 ES的底层就是LuceneES是分布式的 为什么不用数据库去实现搜索功能 我们用搜索“牙膏”商品为例 如果用我们平时数据库来实现搜索的功能在性能上就很差。 ES的官网 ES官网点我 简单使用如下图可以切换成中文的文档 或者使用spark的中文网站也有ES的文档传送门在下面 ES中文文档 ES的由来 因为Lucene有两个难以解决的问题 1数据越大存不下来那我就需要多台服务器存数据那么我的Lucene不支持分布式的那就需要安装多个Lucene然后通过代码来合并搜索结果。这样很不好 2数据要考虑安全性一台服务器挂了那么上面的数据不就消失了。 ES就是分布式的集群每一个节点其实就是Lucene当用户搜索的时候会随机挑一台然后这台机器自己知道数据在哪不用我们管这些底层、 ES的优点 1.分布式的功能 2、数据高可用集群高可用 3.API更简单 4.API更高级。 5.支持的语言很多 6.支持PB级别的数据 7.完成搜索的功能和分析功能 基于Lucene隐藏了Lucene的复杂性提供简单的API ES的性能比HBase高咱们的竞价引擎最后还是要存到ES中的。 搜索引擎原理 反向索引又叫倒排索引是根据文章内容中的关键字建立索引。搜索引擎原理就是建立反向索引。Elasticsearch 在 Lucene 的基础上进行封装实现了分布式搜索引擎。Elasticsearch 中的索引、类型和文档的概念比较重要类似于 MySQL 中的数据库、表和行。Elasticsearch 也是 Master-slave 架构也实现了数据的分片和备份。Elasticsearch 一个典型应用就是 ELK 日志分析系统。 ES支持的语言 Curl、java、c#、python、JavaScript、php、perl、ruby Curl www.baidu.com 就是linux的shell命令。可以访问百度返回的是百度的网页代码 ES的作用 1全文检索 类似 select * from product where product_name like %牙膏% 类似百度效果电商搜索的效果 2结构化搜索 类似 select * from product where product_id 1 3数据分析 类似 select count (*) from product ES的安装 直接解压就能用针对中小型项目大型项目还是要调一调参数的 2.用数据库实现搜素的功能 3.ES的核心概念 3.1 NRT(Near Realtime)近实时 3.2 cluster集群ES是一个分布式的系统 ES直接解压不需要配置就可以使用在hadoop1上解压一个ES在hadoop2上解压了一个ES接下来把这两个ES启动起来。他们就构成了一个集群。 在ES里面默认有一个配置clustername 默认值就是ElasticSearch,如果这个值是一样的就属于同一个集群不一样的值就是不一样的集群。 3.3 Node节点就是集群中的一台服务器 3.4 index 索引索引库 我们为什么使用ES因为想把数据存进去然后再查询出来。 我们在使用Mysql或者Oracle的时候为了区分数据我们会建立不同的数据库库下面还有表的。 其实ES功能就像一个关系型数据库在这个数据库我们可以往里面添加数据查询数据。 ES中的索引非传统索引的含义ES中的索引是存放数据的地方是ES中的一个概念词汇 index类似于我们Mysql里面的一个数据库 create database user; 好比就是一个索引库 3.5 type类型 类型是用来定义数据结构的 在每一个index下面可以有一个或者多个type好比数据库里面的一张表。 相当于表结构的描述描述每个字段的类型。 3.6 document文档 文档就是最终的数据了可以认为一个文档就是一条记录。 是ES里面最小的数据单元就好比表里面的一条数据 3.7 Field 字段 好比关系型数据库中列的概念一个document有一个或者多个field组成。 例如 朝阳区一个Mysql数据库 房子create database chaoyaninfo 房间create table people 3.8 shard分片 一台服务器无法存储大量的数据ES把一个index里面的数据分为多个shard分布式的存储在各个服务器上面。 kafka为什么支持分布式的功能因为里面是有topic支持分区的概念。所以topic A可以存在不同的节点上面。就可以支持海量数据和高并发提升性能和吞吐量 3.9 replica副本 一个分布式的集群难免会有一台或者多台服务器宕机如果我们没有副本这个概念。就会造成我们的shard发生故障无法提供正常服务。 我们为了保证数据的安全我们引入了replica的概念跟hdfs里面的概念是一个意思。 可以保证我们数据的安全。 在ES集群中我们一模一样的数据有多份能正常提供查询和插入的分片我们叫做 primary shard其余的我们就管他们叫做 replica shard备份的分片 当我们去查询数据的时候我们数据是有备份的它会同时发出命令让我们有数据的机器去查询结果最后谁的查询结果快我们就要谁的数据这个不需要我们去控制它内部就自己控制了 总结 在默认情况下我们创建一个库的时候默认会帮我们创建5个主分片primary shrad和5个副分片replica shard所以说正常情况下是有10个分片的。 同一个节点上面副本和主分片是一定不会在一台机器上面的就是拥有相同数据的分片是不会在同一个节点上面的。 所以当你有一个节点的时候这个分片是不会把副本存在这仅有的一个节点上的当你新加入了一台节点ES会自动的给你在新机器上创建一个之前分片的副本。 3.10 举例 比如一首诗有诗题、作者、朝代、字数、诗内容等字段那么首先我们可以建立一个名叫 Poems 的索引然后创建一个名叫 Poem 的类型类型是通过 Mapping 来定义每个字段的类型。 比如诗题、作者、朝代都是 Keyword 类型诗内容是 Text 类型而字数是 Integer 类型最后就是把数据组织成 Json 格式存放进去了。 Keyword 类型是不会分词的直接根据字符串内容建立反向索引Text 类型在存入 Elasticsearch 的时候会先分词然后根据分词后的内容建立反向索引。 4. ES集群的安装 4.1 下载 点击上面的官网传送门点击downloads 下载ES点我 关于ES的版本现在大多数网上和书写的都是ES 2.x系列的书有部分比较新的讲的是ES 5的 没有34一说。是这样的ELK 产品是一个非常完善的系统跟大数据没什么关系后来我们发现可以处理一些大数据的东西。可以和hadoop和spark整合。因为ELK三个产品是不同的公司出的。有一天一个人想把它们整合在一起发现E发展到了2的版本L发展到了3的版本K发展到了4的版本。这样会有一个问题什么样的hive和hbase配合什么样的hadoop这样引发了一个匹配不匹配的问题。三个厂家就决定从下一代产品我们一起升级就从5版本开始所以如果你E用5.6L也应该用5.6K也应该用5.6这样就进行了匹配。 这里我们下载安装目前最新版本的6.3.2的ES注意需要安装好JDK因为是由java开发的。 4.2 安装并启动ES 直接解压即可进入bin目录本文为 G:\myProgram\ElasticSearch\elasticsearch-6.3.2\bin 下进入cmd 输入elasticsearch 验证ES是否启动成功 在浏览器中输入 http://localhost:9200 看到如下所示图片即为成功 4.3 ES的分布式原理 Elasticsearch 也是会对数据进行切分同时每一个分片会保存多个副本其原因和 HDFS 是一样的都是为了保证分布式环境下的高可用。 在 Elasticsearch 中是master-slave架构。节点是对等的节点间会通过自己的一些规则选取集群的 MasterMaster 会负责集群状态信息的改变并同步给其他节点。 这样写入性能会不会很低注意只有建立索引和类型需要经过 Master数据的写入有一个简单的 Routing 规则可以 Route 到集群中的任意节点所以数据写入压力是分散在整个集群的。 5. 安装 Kibana 5.1 为什么要安装 为了方便我们去操作ES如果不安装去操作ES很麻烦需要通过shell命令的方式。 下载Kibana 5.2 安装并启动 直接解压即可进入bin目录下本文为G:\myProgram\kibana\kibana-6.3.2-windows-x86_64\bin 的cmd执行kibana 不需要配置任何参数自动识别localhost 在浏览器中输入 http://localhost:5601 然后在左侧找到Dev Tools在这里就可以进行操作了 输入GET _cat/health 查看集群的健康状况 5.3 参数解析 green每个索引的primary shard和replica shard 都处于active的状态。 下图是一个ES集群有两个节点。主分片是支撑用户的读写。副只支持读数据。这样就造成主分片压力会大一点所以ES集群在分配分片的时候会考虑负载均衡依据就是按照主分片的情况来。 yellow每个索引的primary shard是active的状态但是部分replica shard不是active的状态处于不可用的状态。 使用GET _cat/indices 命令查询ES中所有的index 但是可能查询的不全我们使用下面的命令 GET _all 但是可能会质疑我们刚搭建好什么数据也没插入为什么会有数据查出来。 下面这段话讲的是5.6.3版本。 我们通过启动Kibana进行对接的ES默认自动在ES上创建了一个index库这个库有个特点这个库有一个主分片primary shard有一个replica shard 副分片 如下图所示我们目前windows的状况是启动了一个ES的集群这个集群里面只有一个ES的节点。 然后我们启动了一个kibana kibana识别到了这个ES节点kibana默认在上面创建了一个index这个index的分片情况是 1 primary shard 和1 replica shard 但是可能咱们现在用的这个版本有了一些优化可能就跟上面说的不一样了。我们现在ES的状态是green 如何把集群的状态由yellow变成green 我再启动一个节点换个路径再次解压ES的压缩包在启动起来让之前的那个有地方放置就好了。 再次执行查询健康的命令效果图如下 red不是所有的primary shard 都是active的状态这时候是危险的至少我们不能保证写数据是安全的。 6. ES的相关命令 这里的效果图是没有搭建第二个ES的节点的因为电脑空间不太够了 GET _cat/health 查看集群的健康状况 GET _all PUT 类似于SQL中的增 DELETE 类似于SQL中的删 POST 类似于SQL中的改 GET 类似于SQL中的查 index的操作 PUT /aura_index 增加一个aura_index的index库 GET _cat/indices 命令查询ES中所有的index索引库 5代表的是 primary shard的个数 1代表的是replica shard的个数是5因为副本数为1代表有5个副分片注意这个地方说的1是不包括自己本身的我们的HDFS block3代表的是包括自己本身的 DELETE /aura_index 删除一个aura_index的index库 7. ES的CURD操作 通过演示一个电商的例子感受到ES的语法特点 1插入一条商品数据 注意我们插入数据的时候如果我们的语句中指明了index和type如果ES里面不存在默认帮我们自动创建 2查询商品数据 使用这种语法 GET /index/type/id 3修改商品数据 使用POST来修改数据其实使用PUT也可以实现修改数据原理和hbase比较像。POST的修改数据的方法在第4条中 换个方式下面这种操作也是成功的会丢数据,是全局的修改 4删除商品数据 再次插入之前的数据发现version是5这就说明跟hbase是类似的不会立刻删除会在合适的时机进行删除。 这次我们使用POST的方式进行修改数据POST是局部更新数据别的数据不动。PUT是全局更新 5接着插入两条数据 现在查看所有数据类似于全表扫描 took耗费了6毫秒 shards分片的情况 hits获取到的数据的情况 total3 总的数据条数 max_score1 所有数据里面打分最高的分数 _index:ecommerce index名称 _type:product type的名称 _id:2 id号 _score:1 分数这个分数越大越靠前出来百度也是这样。除非是花钱。否则匹配度越高越靠前 8.DSL语言 ES最主要是用来做搜索和分析的。所以DSL还是对于ES很重要的 下面我们写的代码都是RESTful风格 query DSL:domain Specialed Lanaguage 在特定领域的语言 案例我们要进行全表扫描使用DSL语言查询所有的商品 使用match_all 可以查询到所有文档是没有查询条件下的默认语句。 案例查询所有名称里面包含chenyi的商品同时按价格进行降序排序 如上图所示name为dior chenyi的数据会在ES中进行倒排索引分词的操作这样的数据也会被查询出来。 match查询是一个标准查询不管你需要全文本查询还是精确查询基本上都要用到它。 下面我们按照价格进行排序因为不属于查询的范围了。所以要写一个 逗号 这样我们的排序就完成了 案例实现分页查询 条件根据查询结果包含chenyi的商品再进行每页展示2个商品 案例进行全表扫面但返回指定字段的数据 现在的情况是把所有的数据都返回了但是我们想返回指定字段的数据内容就需要下面的方法了 案例搜索名称里面包含chenyi的并且价格大于250元的商品 相当于 select * form product where name like %chenyi% and price 250; 因为有两个查询条件我们就需要使用下面的查询方式 如果需要多个查询条件拼接在一起就需要使用bool bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑它包含以下操作符 must :: 多个查询条件的完全匹配,相当于 and。 must_not :: 多个查询条件的相反匹配相当于 not。 should :: 至少有一个查询条件匹配, 相当于 or。 这些参数可以分别继承一个过滤条件或者一个过滤条件的数组 案例展示一个全文检索的效果 首先查询条件也会进行分词 kama chenyi 并集 案例不要把条件分词要精确匹配 但是我们现有有一种需求我就是想查询kama chenyi不要分词要精确匹配到 百度就类似于这样 案例把查询结果进行高亮展示 emkama/em这个标签是默认的标签是可以自定义的进行替换的比如我们可以替换成span stylecolor:redkama/span把这个输出到网页上自然而然就是红色的了。 9.聚合分析 案例计算每个标签tag下商品的数量 按标签进行分组类似于 select count(*) from product group by tag; terms 跟 term 有点类似但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值那么文档需要一起去做匹配 error是报错但是这个语句是对的这个报错在ES2之前是没有的在ES5以后才有的在5中fielddatatrue 默认是false以前都是true group_by_tag是个名字随意取 所以我们需要先执行下面的代码进行一下设置的修改 再次执行一次 案例对商品名称里面包含chenyi的计算每个tag下商品的数量 案例查询商品名称里面包含chenyi的数据并且按照tag进行分组计算每个分组下的平均价格 案例查询商品名称里面包含chenyi的数据并且按照tag进行分组计算每个分组下的平均价格按照平均价格进行降序排序 注意写的位置 案例查询出producer里面包含producer的数据按照指定的价格区间进行分组在每个组内再按tag进行分组分完组以后再求每个组的平均价格并且按照降序进行排序 range过滤允许我们按照指定范围查找一批数据 10.ES的隐藏性 ES是一个分布式的系统里面我们在使用的时候隐藏了复杂的分布式的机制 1分片机制 插入数据的时候不是根据负载均衡来插入的是根据一定的路由规则比如我们就取哈希值取模 我们在创建一个index库的时候我们可以指定primary shard的数量也可以指定replica的数量如果不指定那么默认primary shard5 replica1 所以 replica shard5过了一段时间发现数据量很大我们primary shard不够用了那么这个时候想修改shard 的个数能不能改成20个答案不能原来本应该插入到8的位置结果插入到了9的位置这样计算查询规则就错了。所以主分片个数是不能修改的但是副分片的个数是可以进行修改的。具体怎么完成的那是ES内部的事情我们先不用考虑。我们写了段java的代码插入数据到主分片里面去了。具体怎么插入的插入到哪个主分片里面是不需要我们来管的。所以就是把这些功能给隐藏起来了。 如果真的遇见了这样的事再建一个库那个库的分片是20用代码查询出来再导入到这个库中只能用这个方法 总结我们操作的时候很轻松的就把数据存入到我们的ES里面了。存入的时候我们并不关心数据存到哪个分片里面去。 2集群的发现机制 我们做过一个实验一开始我们只启动了一个ES的节点这个时候这个ES的状态是yellow后来我们又启动了一个ES节点发现颜色变成了green这说明我们后面启动的这个节点也自动加入了这个集群。那么这个机制就是集群的发现机制。对于我们也是隐藏起来了。我们没必要知道 3shard 会进行负载均衡 Hbase中如果你新加入了一个Hbase节点不会自动的进行负载均衡需要执行一个命令 但是ES不一样。只要你加入了一个节点会自动帮你进行负载均衡 11.ES集群的扩容问题 扩容分为垂直和水平扩容 我们之前的大数据技术都是分布式的部署在集群上面的。如果我们的资源不够用了这个时候就涉及到了扩容我们是垂直扩容还是水平扩容呢 假设我们每个节点能存储1T的数据现在我们要存储5T的数据 垂直扩容就是把其中的一台换了换成性能更强的节点。有可能一台节点就能存5T。 水平扩容就是新加服务器直到能存下来5T的数据我们一般都是用水平扩容比如1T是1万。5台5万但是单台5T的价钱可能是50万。所以我们几乎不太可能用这种方式。 但是可能那么namenode节点可能是采用垂直扩容 12.对等式架构 在分布式的技术里面。我们大多都是主从式架构 ES是对等式的架构。ES里面也有master节点一说。但是我们不太关心。只需要在配置文件中指定一下让哪几个节点有机会成为主节点。 ES中master的作用 1管理集群的元数据比如说索引的创建和删除等等 2集群里面master也是自动选举的。 看到这里有个疑问这不也是主从式架构么?为什么叫对等式架构呢 HDFS是主从式架构有namenode和datanode我们无论是上传数据也好还是下载数据也好都要跟namenode进行交互交互完才能到datanode中但是我们的ES无论上传和下载数据也好我们不需要跟master进行交互。节点之间的关系都是对等的每个节点都可以进行接收请求和响应请求。 在ES中我们开发好了java代码要跟ES进行交互。他会随意找一台节点但是这台节点不一定有我们要查询的数据但是我们不知道ES节点是知道的每个ES里面都知道其他的数据存在哪ES的节点会自动帮你把请求发到要查询数据的节点上。这样就真的查询出来了。而我们随意找的这个节点叫做协调节点真正数据存放的节点会把数据返回给协调节点。协调节点再给我们java的代码 每一个节点都可以接受和相应请求。如果随机找的刚好是数据所在的节点那么这个节点即是协调节点又是响应节点。 13.ES的primary shard和replica shard 1index可以包含多个type同样一个index下面也可以有多个shard 2在ES里面每个shard就是最小的一个工作单元承载了部分数据 3如果在ES集群里面增加或减少节点shard会自动的实现负载均衡 4primary shard乐意进行读和写replica shard负责读 5primary shard在创建index的时候就固定了不能修改了。 6默认创建一个index的时候primary shard的数量是5replica的数量是1也就是说默认情况下有10个shard其中有5个primary shard5个是replica shard 7primary shard和自己的replica shard是不能在同一台服务器上的。 14.ES的容错机制 1master的选举 2replica的容错 3数据恢复 15.自动生成ID号 下图是指定ID号的方式 下图是自动生成ID号 16.version之悲观锁和乐观锁 悲观锁很悲观自己操作的时候别的线程就不能进行操作。所以在电商的情况下体验性很不好但是不容易出错 乐观锁很乐观因为现在剩3件了假设version号是5AB线程同时进行访问操作AB线程拿到的都是3件version都是5A线程先购买了一件就是3-12 然后A线程拿着2和version号5去更新数据发现version是5就把3件更新为2件同时version变成了6然后B线程买了一件就是3-12 然后拿着2和version号5去更新发现version号不匹配此时重新获取一下version号和仅剩的件数2然后2-11然后拿着1和version号6去更新数据发现version对上了。此时更新成功。 17.用java实现对ES的增删改查