1. 为什么你需要一个自己的搜索系统?
如果你正在开发一个网站或者应用,里面有很多内容,比如商品、文章、用户信息,那么“搜索”功能几乎是标配。但很多时候,我们只是简单地在数据库里用 LIKE 语句模糊匹配一下,结果就是速度慢、搜不准、用户体验差。比如用户想搜“红色连衣裙”,你的数据库可能只返回了标题里包含“红色连衣裙”这五个字连在一起的结果,而“红色 长款 连衣裙”或者“酒红色 裙子”就搜不到了。
这就是为什么我们需要一个专门的搜索引擎。而 Elasticsearch,就是目前这个领域里最流行、最强大的选择之一。它不是一个简单的数据库,而是一个分布式的、实时的搜索和分析引擎。简单来说,它能把你的文本内容“切碎”成一个个有意义的词(分词),然后建立一套超级高效的索引,让你能以毫秒级的速度进行复杂的全文搜索、过滤和聚合分析。
我最早接触 Elasticsearch 是在处理一个电商项目的商品搜索需求时。当时用数据库查询,一旦数据量上了百万,搜索响应时间就变得不可接受。后来切换到 Elasticsearch,不仅搜索速度提升了上百倍,还轻松实现了按价格区间过滤、按品牌聚合、相关商品推荐等高级功能。从那以后,但凡涉及到搜索的场景,我的第一反应就是:“上 ES 吧”。
这篇文章,我就把自己从零开始搭建和使用 Elasticsearch 的实战经验,包括那些踩过的坑和总结的优化技巧,毫无保留地分享给你。我们的目标很明确:不用纠结太多复杂理论,直接上手,构建一个真正能用、好用、高效的系统。
2. 动手之前,先搞懂这几个核心“黑话”
在开始敲命令之前,花几分钟理解 Elasticsearch 的几个核心概念非常重要,这能让你后续的配置和操作不再云里雾里。你可以把它们想象成一个图书馆的管理体系。
### 2.1 集群、节点与分片:图书馆是如何扩建的?
想象一下,你有一个小书店,所有书(数据)都放在一个书架(节点)上。这就是单节点模式。生意好了,书越来越多,一个书架放不下了,你就得开分店。
- 集群:就是你开的所有分店(节点)组成的连锁书店集团。它们彼此联网,共同管理所有书籍。
- 节点:就是每家单独的分店。在 Elasticsearch 里,节点有不同的“工种”:
- 主节点:像总店经理,负责管理整个集群的“元数据”,比如哪些店有哪些书的分区图,但不直接存书。一个集群通常有多个候选主节点,通过选举产生一个活跃主节点。
- 数据节点:像仓库,真正存储书籍(数据)的地方。我们大部分的数据读写压力都在数据节点上。
- 协调节点:像前台接待。客户(你的应用程序)的请求先发到协调节点,它负责把请求转发给正确的数据节点,并把结果汇总返回。任何节点默认都具备协调功能。
- 分片:这是 Elasticsearch 实现海量数据存储和并行处理的核心魔法。即使在一家分店(数据节点)里,一套百科全书也太厚了,不好找。于是我们把这本书拆成第1-5卷、第6-10卷……每一卷就是一个主分片。这些分片可以被分散到不同的分店(数据节点)去存储和查询,实现了水平扩展和并行计算。
- 副本分片:为了防止某卷书丢失或损坏,我们为每一卷都制作了完整的复印本,这就是副本分片。副本提供了数据高可用性(主分片挂了,副本顶上)和提升读取性能(读请求可以负载均衡到主分片或任意副本上)。
### 2.2 索引、类型与文档:书架、标签和具体的书
现在来看数据本身是如何组织的。
- 索引:这是 Elasticsearch 里最高层的数据容器,类似于关系型数据库里的“表”。比如,你可以有一个
products索引来存所有商品,一个users索引来存所有用户。在 7.x 版本之后,一个索引默认只包含一种类型_doc,所以你可以近似把“索引”理解成“表”。 - 文档:索引中的一条条记录,就是文档。它是 Elasticsearch 里可被搜索的最小数据单元,使用 JSON 格式。比如一件商品
{"name": "无线蓝牙耳机", "price": 299, "brand": "BrandX"}就是一个文档。每个文档都有一个唯一的 ID。 - 映射:这定义了索引的“数据结构”,类似于数据库的表结构。它决定了每个字段(如
name,price)是什么类型(文本、数字、日期等),以及文本字段该如何被分词。- 动态映射:你直接插入一个 JSON 文档,Elasticsearch 会自动猜测字段类型并创建映射。方便,但有时会猜错,比如把“123”猜成数字,但其实它可能是产品型号文本。生产环境慎用。
- 显式映射:我强烈推荐的方式。在插入数据前,手动定义好每个字段的类型和属性,确保数据的一致性和查询的准确性。
3. 从零开始:搭建你的第一个 Elasticsearch 服务
理论懂了,我们开始实战。这里我会以 Linux 系统(Ubuntu 20.04)为例,带你一步步走通。
### 3.1 安装准备:打好地基
Elasticsearch 是 Java 写的,所以第一件事就是安装合适的 Java 环境。我推荐使用 OpenJDK,避免版权问题。
# 更新包列表
sudo apt update
# 安装 OpenJDK 11 (Elasticsearch 7.x/8.x 推荐版本)
sudo apt install openjdk-11-jdk -y
# 验证安装
java -version
接下来,需要调整一些系统参数,否则 Elasticsearch 可能启动失败。
# 修改虚拟内存区域数量限制(防止内存不足错误)
sudo sysctl -w vm.max_map_count=262144
# 为了让这个设置永久生效,编辑 /etc/sysctl.conf,添加一行 vm.max_map_count=262144
# 修改用户可打开文件数限制(应对高并发)
# 编辑 /etc/security/limits.conf,在文件末尾添加:
# * soft nofile 65536
# * hard nofile 65536
# 然后退出当前终端,重新登录生效
### 3.2 下载、安装与基础配置
我们从 Elastic 官网直接下载最新稳定版的压缩包,这种方式最干净。
# 下载 Elasticsearch 8.17.0 (请检查官网获取最新版本号)
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.0-linux-x86_64.tar.gz
#

2万+

被折叠的 条评论
为什么被折叠?



