VPS 自建搜索:Elasticsearch / Meilisearch 全文检索与中文分词落地(2026)

想在 VPS 上自建搜索引擎?本文对比 Elasticsearch 与 Meilisearch 在 VPS 上的部署、中文 IK 分词、JVM 堆内存与 RAM 配置,帮你按数据和预算选对方案,附 Docker 实操与选型对照表。

如果你手上有个站点、一批日志或者一坨文档,想要「输入即搜、中文不乱切、结果相关度高」,在 VPS 上自建搜索引擎是绕不开的一步。很多人第一反应是「上 Elasticsearch」,但 Elasticsearch 8.x 对内存相当挑剔,没配好堆内存就可能频繁 Full GC 甚至 OOM;而另一派会选 Meilisearch——一个用 Rust 写的单二进制搜索引擎,开箱即用地支持中文,内存占用只有 ES 的零头。本文不站队,只把两种方案在 VPS 上的真实落地讲清楚:怎么装、中文怎么分词、内存怎么配、RAM 不够会怎样,帮你按自己的数据和预算做选择。

延伸阅读

更多相关攻略推荐:【VPS 硬件选型指南 (CPU 篇) 03】VPS 性价比怎么算?【内存技术 01】DDR4 还是 DDR5?2026 年内存涨价背景【VPS 硬件选型指南 (CPU 篇) 02】AMD EPYC vs从免费赠送到一枚 50 美元:IPv4 地址的价格变迁与二手交易风云打死不宕机:Linux 系统内核免重启升级(Kexec 快速切换与

一、先选阵营:Elasticsearch 还是 Meilisearch

两个都不是「错了就完蛋」的方案,但适用面明显不同。Elasticsearch(下文简称 ES)是搜索领域的老大哥,生态、插件、聚合分析能力全到离谱,适合「站点搜索 + 日志分析(配合 Kibana/OpenSearch)+ 复杂聚合」一把梭;代价是它吃内存、要吃 JVM 堆、要单独配中文分词插件。Meilisearch 是 2018 年才出现的轻量选手,主打「快、易装、即时搜索(typo tolerant)」,单二进制、几乎零配置,中文靠内置 CJK 分词就能跑,适合「给博客/文档/电商加一个即时搜索框」这种明确需求。

  • 要全文检索 + 日志 + 聚合分析 + 海量数据:选 ES,它扛得住亿级文档和复杂查询。
  • 只要一个快、准、好上手的站内搜索:选 Meilisearch,半小时能跑起来,RAM 占用低一个量级。
  • 预算紧张、VPS 只有 1–2G 内存:基本只能考虑 Meilisearch,ES 单机起步建议 4G。

二、Elasticsearch 部署:Docker 单节点跑通

新手最容易在「单节点」上踩坑。ES 8.x 默认开启安全认证(TLS + 密码),单台机器练习时可以用 discovery.type=single-node 跳过集群发现,但 vm.max_map_count 这个内核参数必须改,否则容器起不来。下面是一段可直接用的单节点 docker run:

sudo sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf

docker run -d \
  --name elasticsearch \
  --ulimit nofile=65536:65536 \
  --ulimit memlock=-1:-1 \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \
  -e "xpack.security.enabled=false" \
  --memory="4g" \
  docker.elastic.co/elasticsearch/elasticsearch:8.15.3

注意三点:第一,vm.max_map_count 至少 262144,否则 ES 启动会报 max virtual memory areas 错误;第二,--ulimit memlock=-1:-1 让 JVM 能锁内存,避免被交换到磁盘;第三,生产环境务必开着 xpack.security 并配 TLS,上面的 xpack.security.enabled=false 只适合内网练习机,公网裸奔 9200 端口等于把数据拱手送人。

三、中文分词:IK 插件是事实标准

ES 自带的分词器对中文是「按字切」,搜「便宜国外 VPS」会被切成「便 / 宜 / 国 / 外 / V / P / S」,召回和相关度都惨不忍睹。中文全文检索的事实标准是 IK Analysis 插件,它提供 ik_max_word(最细粒度,索引时用)和 ik_smart(最粗粒度,查询时用)两种模式。关键铁律:IK 插件版本必须和 ES 主版本号完全一致,8.15.3 的 ES 就得装 8.15.3 的 IK,差一个小数点都装不上。

docker exec -it elasticsearch /bin/bash
./bin/elasticsearch-plugin install \
  https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.15.3/elasticsearch-analysis-ik-8.15.3.zip
exit
docker restart elasticsearch

装完用 _analyze 接口验证,能正确切出「中文 / 分词 / 测试」说明成功:

curl -X POST "localhost:9200/_analyze" \
  -H "Content-Type: application/json" \
  -d '{"analyzer":"ik_max_word","text":"便宜国外 VPS 优惠导航"}'

实战建议:索引(写入)用 ik_max_word 让词典尽可能全,查询时用 ik_smart 减少无关碎片,相关度更干净。如果你的业务词很垂直(比如满屏科技术语),还可以在 IKAnalyzer.cfg.xml 里挂自定义词典,把品牌名、专有名词加进去,避免被切坏。

四、JVM 堆内存配置:ES 的命门

ES 是 Java 写的,跑得快不快、稳不稳,一半取决于 JVM 堆(heap)怎么设。核心规则两条:堆大小不要超过物理内存的 50%,剩下的留给操作系统做文件系统缓存(Lucene 严重依赖 OS cache 放索引);堆不要超过约 32GB,因为 JVM 在堆小于 32GB 时启用「压缩普通对象指针(Compressed Oops)」,一旦超过这个阈值,对象指针翻倍,反而更占内存、更慢。社区常说的「30–31GB 是甜点」就是这个原因。

  • 4G 内存机器:设 -Xms2g -Xmx2g(堆 2G,留 2G 给 OS cache),是单节点最低舒服线。
  • 8G 内存机器:设 -Xms4g -Xmx4g,堆 4G 留 4G,能扛中小站点搜索 + 轻量日志。
  • 16G 以上:堆也别无脑拉满,30G 封顶,多余内存全留给 cache 和聚合。

务必让 -Xms 和 -Xmx 相等,避免 JVM 在运行中动态扩容带来停顿;通过 ES_JAVA_OPTS 环境变量传入,不要手改 jvm.options 后忘记重启。堆设太小会频繁 GC 卡死,设太大(超 32G)反而因指针膨胀变慢——这是 ES 最经典的「好心办坏事」。

五、Meilisearch 部署:一个二进制搞定

讲完 ES 的「重」,再看 Meilisearch 的「轻」。它是 Rust 写的单二进制,没有 JVM、没有插件体系、没有一堆 yaml,Docker 一行就能起来。关键点:生产环境必须设 MEILI_ENV=production(强制要求主密钥、关掉匿名遥测),主密钥 MEILI_MASTER_KEY 至少 16 字节,否则生产模式拒绝启动;数据挂到 /meili_data 做持久化,否则容器一重启索引全没。

docker run -d \
  --name meilisearch \
  -p 7700:7700 \
  -v $(pwd)/meili_data:/meili_data \
  -e MEILI_MASTER_KEY="请替换为至少 16 字节的随机密钥例如 openssl rand -hex 32" \
  -e MEILI_ENV="production" \
  --restart unless-stopped \
  getmeili/meilisearch:v1.13

版本记得固定标签(比如 v1.13 或更晚的稳定版),别用 latest——小版本之间偶尔有破坏性变更,半夜容器自动拉了新版本导致不兼容是最糟的惊喜。Meilisearch 默认监听 HTTP 7700 端口,公网千万别直接暴露,老规矩:前面挡一层 Caddy/Nginx 做 HTTPS 反向代理,密钥通过环境变量注入、存进密钥管理器,丢了主密钥只能重建索引。

六、Meilisearch 中文搜索:内置 CJK 就够用

Meilisearch 对中文是「开箱即支持」。从早期版本起它就内置了 CJK(中日韩)字符处理:中文不像英文按空格分词,Meilisearch 会按字符做 n-gram 切分并叠加邻近度排序,所以「便宜国外 VPS」这种短句直接建索引就能搜。对绝大多数博客、文档、电商搜索,内置分词已经够用,不像 ES 那样必须额外装插件

如果你对中文切词精度有更高要求(比如想按「词语」而非「字符」召回),社区有 meilisearch-jieba 这类插件,用结巴分词做更地道的中文词粒度索引。但实话实说,对站内搜索场景,先用内置 CJK 跑起来,等真遇到召回问题再上 jieba 也不迟——这正好是 Meilisearch「先跑通再优化」哲学的体现。

七、内存与磁盘:RAM 到底怎么配

Meilisearch 会把索引缓存进 RAM 以加速查询,所以内存直接决定能扛多少文档。下面这张表来自社区在生产环境实测的经验值,是选型时最实用的参考(注意索引阶段比稳态查询更吃内存,按索引峰值留余量):

文档量级建议 RAM建议磁盘
小于 10 万1 GB2 GB
10 万 – 100 万2 GB10 GB
100 万 – 1000 万4–8 GB50 GB
1000 万以上16 GB+100 GB+

对比一下就很明显:同样 100 万文档,ES 单节点舒服线在 4G 以上(且其中 2G 是堆),Meilisearch 2G 就能稳。磁盘务必上 NVMe SSD——Meilisearch 写索引时疯狂读写磁盘,SATA SSD 或 HDD 会成为最大瓶颈。索引期间临时空间建议留足索引大小的 3 倍,否则中途磁盘写满任务直接失败。

八、VPS 怎么选:把 RAM 花在刀刃上

回到「VPS 自建搜索」的本质诉求:你是在为 RAM 和磁盘 IO 买单。给个实在的对照:

方案起步 RAM舒适 RAM中文分词适合数据量
Meilisearch1 GB2–4 GB内置 CJK千万级以内
Elasticsearch 单节点4 GB8 GB+需装 IK 插件亿级 + 聚合

预算紧、数据量中等,直接上 Meilisearch + 一台 2–4G 内存的 VPS(20 刀以内年付 VPS 横评 里的大内存款很合适);要做日志分析、复杂聚合、或文档量上亿,老老实实给 ES 配 8G 以上内存的机器(性价比年付 VPS 里的高内存机型)。不管选哪个,记得给 VPS 加一点 swap 兜底,ES 在内存临界时会靠 swap 续命,Meilisearch 索引峰值也能靠 swap 缓冲。

九、安全、备份与运维常识

  • 别裸奔端口:ES 的 9200、Meilisearch 的 7700 都不该直接对公网开放。用 Nginx/Caddy 反代 + Let's Encrypt 证书收口,密钥走环境变量。
  • 备份是底线:ES 用 snapshot 快照到对象存储;Meilisearch 用 dump(全量导出)或定时快照,把 /meili_data 定期打包。具体策略见 VPS 备份策略
  • 监控健康:ES 打 GET /_cluster/health,Meilisearch 打 GET /health,丢进监控脚本每 5 分钟探一次,比半夜被叫醒强。
  • 升级要谨慎:ES 大版本间索引格式可能不兼容,升级前先快照;Meilisearch 固定版本标签,别让 latest 自动跳。

#VPS自建搜索 #Elasticsearch #Meilisearch