引言
当我信心满满地在浏览器输入 http://192.168.61.135:9200/,准备验收刚装完的 Elasticsearch 时,屏幕上赫然跳出一行字:"URL 拼写可能存在错误,请检查"。
我当场愣住 ------ 地址明明是从配置文件里原封不动复制的,怎么会错?接下来的半小时,我经历了从怀疑人生到逐个排查,终于把这个 "傲娇" 的全文检索服务器跑通了。今天就把这份踩坑实录分享给大家,保证新手看完能少走 90% 的弯路!
一、为什么 MySQL 不够用,非要学 ES?
很多同学一开始都会有这个疑问:我用 MySQL 的like '%关键词%'不也能做搜索吗?
举个最简单的例子:假设你有一个课程表,里面有课程名、课程描述、讲师三个字段,用户输入 "Python" 要搜索所有相关课程。用 MySQL 的话,你得写:
这行 SQL 看似简单,但背后是三次全表扫描!如果你的数据量有几十万、几百万条,查询速度会慢到让用户直接关掉页面。
而 Elasticsearch(简称 ES)就是为解决这个问题而生的 ------ 它天生擅长全文检索,能在毫秒级返回海量数据的搜索结果,这也是现在电商、资讯、社交平台都用它做搜索的核心原因。
二、ES 安装全流程:避坑指南(亲测有效)
我用的是 ES 6.2.3 版本(和 Spring Boot 兼容性最好),安装在 CentOS 虚拟机上,全程踩过的坑都给你们标出来了!
1. 前置准备:别省内存!
第一个大坑:虚拟机内存必须大于 1.5G!我一开始只给了 1G,ES 启动到一半直接闪退,连报错日志都没来得及写。建议直接给 2G,一步到位。
2. 必须用非 root 用户启动
ES 出于安全考虑,禁止 root 用户直接启动,这也是新手最容易踩的坑。我们需要创建专门的用户并分配权限:
3. 解压安装包
切换到 admin 用户,把下载好的elasticsearch-6.2.3.tar.gz上传到/usr/upload,然后解压:
4. 修改核心配置文件
这是最关键的一步,我之前的 "URL 拼写错误" 就是因为这里配置错了! 编辑/usr/local/elasticsearch-6.2.3/config/elasticsearch.yml:
5. 系统参数优化(不做必报错)
ES 对系统的文件句柄数和虚拟内存有要求,默认值不够,需要修改:
6. 启动 ES 并验证
终于到启动环节了!切换回 admin 用户:
等待 10 秒左右,在浏览器输入 http://你的虚拟机IP:9200,如果看到下面的 JSON,就说明安装成功了!
如果还是提示 "URL 拼写错误",按这个顺序排查:
-
ES 是否真的启动了:
ps -ef | grep elasticsearch -
虚拟机防火墙是否关闭:
systemctl stop firewalld -
network.host是否设为0.0.0.0 -
虚拟机 IP 是否和配置的一致
三、第一个 ES 操作:索引和文档的 CRUD
ES 的核心概念其实很好理解:
-
索引(Index):相当于 MySQL 的数据库
-
类型(Type):相当于 MySQL 的表(ES 7.0 后已废弃,这里 6.2.3 还能用)
-
文档(Document):相当于 MySQL 的一行数据
我们用 Postman 来做几个简单的操作,感受一下 ES 的魅力。
1. 创建索引
发送 PUT 请求到 http://192.168.61.135:9200/java06,请求体:
✅ 注意:主分片数量一旦创建就不能修改!因为 ES 是通过hash(文档ID) % 主分片数来决定文档存在哪个分片上的,改了主分片数,之前的数据就找不到了。
2. 新增文档
发送 POST 请求到 http://192.168.61.135:9200/java06/course/1,请求体:
3. 查询文档
发送 GET 请求到 http://192.168.61.135:9200/java06/course/1,就能看到我们刚插入的数据了。
4. 修改和删除文档
-
修改:发送 PUT 请求到同一个地址,覆盖原来的内容即可
-
删除:发送 DELETE 请求到
http://192.168.61.135:9200/java06/course/1
四、总结与下节预告
今天我们从一个报错开始,搞定了 ES 的安装和基础 CRUD。其实 ES 的强大远不止于此,它之所以搜索这么快,核心在于倒排索引。
下一篇我会用最通俗的方式讲清楚倒排索引的原理,还有中文分词神器 IK 的使用,以及字段类型的最佳实践 ------ 这些都是面试必问的考点,也是写好 ES 代码的关键!