全文检索引擎Elasticsearch-1
1 快速了解Elasticsearch
为什么要学Elasticsearch?
1 | 针对海量数据计算分析,前面我们学习了MapReduce、Hive、Spark、Flink这些计算引擎和分析工具,但是它们侧重的都是对数据的清洗、聚合之类的需求。 |
Elasticsearch简介
1 | Elasticsearch是一个分布式的全文检索引擎,它是对lucene的功能做了封装,能够达到实时搜索,稳定,可靠,快速等特点。 |
常见的全文检索引擎
1 | Lucene |
Solr vs Elasticsearch
1 | Elasticsearch一般我们会简称为ES。 |

1 | Solr从2007年就出现了,在传统企业中应用的还是比较广泛的,并且在2013年的时候,Solr推出了4.0版本,提供了Solrcloud,开始正式支持分布式集群。 |
MySQL VS Elasticsearch
1 | 为了便于理解ES,在这里我们拿MySQL和ES做一个对比分析: |

1 | 解释: |
1 | 为何要取消Type? |
Elasticsearch核心概念

1 | ES中几个比较核心的概念: |
1 | 接下来具体分析一下这几个概念: |
1 | Shard |
1 | Replica |
1 | Recovery |
2 快速上手使用Elasticsearch
ES安装部署
1 | ES支持单机和集群,在使用层面是完全一样的。 |


1 | 注意:目前ES中自带的有open JDK,不用单独安装部署Oracle JDK。 |

1 | 在具体安装集群之前,先来分析一下ES中的核心配置文件: |
1 | # ======================== Elasticsearch Configuration ========================= |
1 | 这段配置的意思是,让Elasticsearch请求JVM锁定堆内存,防止内存被操作系统交换到磁盘上¹²。这样可以提高Elasticsearch 的性能和稳定性,因为垃圾回收时不会触及已经交换出去的内存页¹。如果启用了bootstrap.memory_lock设置,那么JVM会预留它需要的任何内存⁴。如果要使用这个设置,还需要在操作系统或Docker容器中配置相应的ulimit或sysctl参数²³。 |
1 | 您可以在一台机器上搭建多个ElasticSearch节点来组成一个集群。首先,您需要在机器上安装JDK环境,然后从官网下载ElasticSearch并解压。接着,您需要修改配置文件`elasticsearch.yml`,设置集群名称、节点名称、网络主机、HTTP端口等信息。此外,您还需要修改Linux系统设置,放行主节点端口,并创建ES用户来启动ES的多个节点。最后,您可以使用`curl`命令来查看ES节点的状态 ¹。 |
ES单机
1 | 1:将ES的安装包上传到bigdata01的/data/soft目录下 |
1 | 2:在Linux中添加一个普通用户:es。 |
1 | 3:修改Linux中最大文件描述符以及最大虚拟内存的参数 |
1 | 4:重启Linux系统。 |
1 | 6:配置ES_JAVA_HOME环境变量,指向ES中内置的JDK。 |
1 | 7:修改elasticsearch-7.13.4目录的权限 |
1 | 8:切换到es用户 |
1 | [es@bigdata01 soft]$ cd elasticsearch-7.13.4 |
1 | 10:启动ES服务【前台启动】 |
1 | 12:验证ES服务。 |
1 | 通过web界面验证服务是否可以正常访问,端口为9200。 |

1 | 注意:需要关闭防火墙。 |
1 | 13:停止ES服务。 |
1 | 14:日志排查方式。 |
ES集群
1 | ES集群规划: |
1 | 1:在bigdata01、bigdata02、bigdata03中创建普通用户:es。 |
1 | useradd es和useradd -d /home/es -m es的区别是,前者会创建一个名为es的用户,但不会指定或创建它的家目录,后者会创建一个名为es的用户,并指定它的家目录为/home/es,并且使用-m选项来创建这个目录¹。如果你想修改一个已经存在的用户的家目录,你可以使用usermod -d命令¹。 |
1 | 2:在bigdata01、bigdata02、bigdata03中修改Linux中最大文件描述符以及最大虚拟内存的参数。 |
1 | 3:重启bigdata01、bigdata02、bigdata03,让前面修改的参数生效。 |
1 | 6:修改elasticsearch.yml配置文件 |
1 | 9:在bigdata01、bigdata02、bigdata03中分别启动ES。 |
1 | 10:验证集群中的进程。 |

ES集群监控管理工具-cerebro
1 | 为了便于我们管理监控ES集群,推荐使用cerebro这个工具。 |

1 | 2:将下载好的cerebro-0.9.4.zip安装包上传到bigdata01的/data/soft目录中并且解压。 |
1 | 3:启动cerebro。 |
1 | 注意:默认cerebro监听的端口是9000,如果出现端口冲突,需要修改cerebro监控的端口 |

1 | 4:使用cerebro。 |

1 | 5:使用cerebro监控管理ES集群。 |

1 | 注意:集群有三种状态,green、yellow、red。 |
1 | 6:cerebro的所有功能。 |

1 | 6.1:查看节点信息 |

1 | 6.2:rest功能。 |

1 | 6.3:更多功能。 |

ES的基本操作
1 | 针对ES的操作,官方提供了很多种操作方式。 |

1 | 在实际工作中使用ES的时候,如果想屏蔽语言的差异,建议使用REST API,这种兼容性比较好,但是个人感觉有的操作使用起来比较麻烦,需要拼接组装各种数据字符串。 |
使用REST API的方式操作ES
1 | 如果想要在Linux命令行中使用REST API操作ES,需要借助于CURL工具。 |
索引库的操作(创建、删除)
1 | HTTP协议中除了GET和POST请求之外,还有其他几种请求类型,包括: |
1 | 创建索引库: |
1 | 注意:索引库名称必须要全部小写,不能以_、 -、 +开头,也不能包含逗号。 |
1 | [root@bigdata01 soft]# curl -XDELETE 'http://bigdata01:9200/test/' |
1 | 注意:索引库可以提前创建,也可以在后期添加数据的时候直接指定一个不存在的索引库,ES默认会自动创建这个索引库。 |
1 | 手工创建索引库和自动创建索引库的区别就是,手工创建可以自定义索引库的分片数量。 |
1 | -H参数用于在curl命令中设置HTTP请求头。在这个例子中,-H "Content-Type: application/json"表示设置HTTP请求头的Content-Type字段为application/json,即告诉服务器请求体中的数据是JSON格式。 |

1 | 其中实线的框表示是主分片,虚线框是副本分片。 |
1 | 到bigdata01节点中看一下,ES中的所有数据都在ES的数据存储目录中,默认是在ES_HOME下的data目录里面: |
1 | 这里面的1IQ2r-vqRxSsicd8BzWPtg表示的是索引库的UUID。 |


索引的操作(增、删、改、查)
1 | 添加索引 |
1 | 注意: |

1 | 2.为了兼容之前的API,虽然ES现在取消了Type,但是API中Type的位置还是预留出来了,官方建议统一使用_doc 。 |
1 | 注意:在添加索引的时候,如果没有指定数据的ID,那么ES会自动生成一个随机的唯一ID。 |
1 | 查询索引: |
1 | 只获取部分字段内容。 |
1 | 查询指定索引库中所有数据。 |
1 | 注意:针对这种查询操作,可以在浏览器里面执行,或者在cerebo中查询都是可以的,看起来更加清晰。 |
1 | 在这里扩展一个知识点,使用RestAPI执行query查询。 |
更新索引
1 | 可以分为全部更新和局部更新 |
1 | [root@bigdata01 soft]# curl -H "Content-Type: application/json" -XPOST 'http://bigdata01:9200/emp/_doc/1/_update' -d '{"doc":{"age":25}}' |
删除索引
1 | 删除id=1的索引数据。 |
1 | [root@bigdata01 soft]# curl -XDELETE 'http://bigdata01:9200/emp/_doc/1' |
1 | 如果索引数据(文档)存在,ES返回的数据中,result属性值为deleted,_version(版本)属性的值+1。 |
Bulk批量操作
1 | Bulk API可以帮助我们同时执行多个请求,提高效率。 |
1 | 解释: |
1 | 下面来看一个案例,假设在MySQL中有一批数据,首先需要从MySQL中把数据读取出来,然后将数据转化为Bulk需要的数据格式。 |
1 | [root@bigdata01 elasticsearch-7.13.4]# vi request |
1 | 执行Bulk API |
1 | [root@bigdata01 elasticsearch-7.13.4]# curl -XGET 'http://bigdata01:9200/test/_search?pretty' |
1 | Bulk一次最大可以处理多少数据量? |
使用Java API的方式操作ES
1 | 针对Java API,目前ES提供了两个Java REST Client版本: |
1 | 如果考虑到代码后期的兼容性,建议使用Java Low Level REST Client。 |
1 | 创建maven项目:db_elasticsearch |
1 | 在resources目录下添加log4j2.properties。 |
索引库的操作(创建、删除)
1 | package com.imooc.es; |
1 | 执行代码的时候会有一个警告信息,提示ES集群没有开启权限校验机制,其实在企业中只要在运维层面控制好了ES集群IP和端口的访问其实就足够了。 |
索引的操作(增、删、改、查、Bulk批量操作)
1 | package com.imooc.es; |