一、为什么要用 Elasticsearch?
传统关系型数据库(如 MySQL)在做搜索时存在明显问题:
-
多字段模糊查询需要
LIKE '%关键词%' -
会导致 全表扫描
-
数据量大时性能急剧下降
**Elasticsearch(简称 ES)** 就是为了解决这些问题而生的。
二、什么是 Elasticsearch?
-
Elasticsearch 是一个 基于 Lucene 的全文检索服务器
-
对外提供 RESTful API
-
支持分布式、高可用、水平扩展
-
常用于:
-
搜索引擎
-
日志分析(ELK)
-
商品搜索、内容搜索
-
三、Elasticsearch 的核心原理
1️⃣ 正排索引(Forward Index)
文档 → 关键词
-
类似:从字典第 1 页翻到第 N 页
-
查找效率低
-
MySQL 使用的就是这种方式
2️⃣ 倒排索引(Inverted Index)✅
关键词 → 文档
倒排索引的组成
| 名称 | 说明 |
|---|---|
| Term | 分词后的关键词(类似字典目录) |
| Term → Document | 关键词与文档之间的映射关系 |
| Document | 实际存储的数据 |
分词特点
-
不重复(如:手机)
-
无意义词不参与分词(的、地、得)
-
不需要搜索的字段不参与分词(如 image)
✅ 搜索时,先在 Term 列表中匹配,再定位 Document
四、Elasticsearch 安装(Linux)
1️⃣ 准备环境
# 虚拟机内存建议 > 1.5G
free -h
2️⃣ 创建专用用户(⚠ ES 不能用 root 启动)
groupadd es
useradd admin
passwd admin
usermod -G es admin
su admin
groups
3️⃣ 授权目录
su root
chown -R admin:es /usr/upload
chown -R admin:es /usr/local
4️⃣ 上传并解压 ES
su admin
cd /usr/upload
tar -zxvf elasticsearch-6.2.3.tar.gz -C /usr/local
5️⃣ 修改配置文件
📄 elasticsearch.yml
cluster.name: power_shop
node.name: power_shop_node_1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.61.135:9300"]
path.data: /usr/local/elasticsearch-6.2.3/data
path.logs: /usr/local/elasticsearch-6.2.3/logs
http.cors.enabled: true
http.cors.allow-origin: "*"
6️⃣ 修改系统参数(非常重要)
(1)文件句柄数
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
(2)虚拟内存
vim /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p
7️⃣ 启动与关闭
cd /usr/local/elasticsearch-6.2.3/bin
# 启动
./elasticsearch
# 后台启动
./elasticsearch -d
查看进程:
ps -ef | grep elasticsearch
kill -9 PID
✅ 访问测试:
http://192.168.61.135:9200/
五、Elasticsearch 基础操作
1️⃣ Index 管理
✅ 创建索引
PUT /java06
{
"settings": {
"number_of_shards": 2,
"number_of_replicas": 0
}
}
⚠ 单机环境 replica 必须为 0
✅ 修改副本数
PUT /java06/_settings
{
"number_of_replicas": 1
}
❗ 主分片数量一旦创建 不能修改
✅ 删除索引
DELETE /java06
2️⃣ Type 映射(Mapping)
POST /java06/_mapping/course
{
"properties": {
"name": {
"type": "text"
},
"description": {
"type": "text"
},
"studymodel": {
"type": "keyword"
}
}
}
3️⃣ Document 操作
✅ 新增文档
POST /java06/course/1
{
"name": "Python 从入门到放弃",
"description": "人生苦短,我用 Python",
"studymodel": "201002"
}
✅ 修改文档
PUT /java06/course/1
{
"name": "Python 从入门到精通"
}
✅ 删除文档
DELETE /java06/course/1
✅ 查询文档
GET /java06/course/1
六、IK 分词器
1️⃣ 安装 IK
# 解压后上传到 plugins 目录
/usr/local/elasticsearch-6.2.3/plugins/ik
重启 ES。
2️⃣ 自定义词典
📄 IKAnalyzer.cfg.xml
<entry key="ext_dict">main.dic</entry>
<entry key="ext_stopwords">stopword.dic</entry>
| 文件 | 作用 |
|---|---|
| main.dic | 扩展词典(如:奥里给) |
| stopword.dic | 停用词(的、地、得、a、an、the) |
⚠ 文件编码必须是 UTF-8
3️⃣ 分词模式对比
| 模式 | 说明 | 使用场景 |
|---|---|---|
| ik_smart | 粗粒度 | 搜索 |
| ik_max_word | 细粒度 | 写入 |
七、总结
✅ Elasticsearch 通过 倒排索引 实现高效搜索
✅ 安装时注意 不能用 root 启动
✅ 主分片数不可修改
✅ IK 分词器是中文搜索的关键
如果你愿意,我可以再帮你:
-
✅ 起一个 CSDN 爆款标题
-
✅ 加一版 目录导航
-
✅ 给你配一张 ES 架构示意图
-
✅ 改成 面试问答版
你可以直接说:"帮我起个标题" 或 **"我要面试版"** 😊