Manticore Search 是一款使用 C++ 开发的高性能搜索引擎,诞生于 2017 年,前身是 Sphinx Search。它在 Sphinx 的基础上重构了大量代码,修复了数百个缺陷,并持续保持开源,最终演进成一个现代、快速、轻量且功能齐全的全文搜索数据库。
Manticore Search 在 GitHub 上已收获 3.7k Stars,社区活跃。官方仓库的简介中直接声明:它是 Elasticsearch 的优良替代品,并计划在不久的将来替代 ELK 技术栈中的 E。

来自官方的性能测试也印证了这一点:在典型的日志分析和查询场景下,Manticore 相比 Elasticsearch 有质的飞跃。

在特定场景中,Manticore 甚至比 Elasticsearch 快 15 倍!详细的基准测试报告可参见官方博客:
优势
与其他搜索方案相比,Manticore 有几个突出的杀手锏:
- 极致性能:
- 小数据量场景,比 MySQL 快 182 倍(可复现)
- 日志分析场景,比 Elasticsearch 快 29 倍(可复现)
- 小型数据集,比 Elasticsearch 快 15 倍(可复现)
- 中型数据,比 Elasticsearch 快 5 倍(可复现)
- 大型数据,比 Elasticsearch 快 4 倍(可复现)
- 单机数据导入吞吐量,最高可达 Elasticsearch 的 2 倍(可复现)
- 现代架构:多线程设计,能充分利用所有 CPU 核心,查询并行化能力极强。
- 强大全文搜索:无论数据集大小,都能提供快速准确的全文检索。
- 灵活存储:支持行存(适合小、中、大数据集)以及列存(Manticore Columnar Library),处理超出内存的数据集也无压力。
- 自动索引:自动创建高效的二级索引,省时省力。
- 查询优化:内置成本优化型查询优化器,确保最佳性能。
- SQL 原生:使用 SQL 作为原生语法,兼容 MySQL 协议,可以直接用 MySQL 客户端连接。
- 多语言客户端:提供 PHP、Python、JavaScript、Java、Elixir、Go 等客户端,集成简单。
- HTTP JSON 协议:提供程序化接口,方便数据与模式管理。
- 轻量化:C++ 编写,启动快、内存占用低,底层优化充分。
- 实时插入:新写入的文档立即可查。
- 内置复制与负载均衡:增加系统可靠性。
- 数据同步:可从 MySQL、PostgreSQL、ODBC、XML、CSV 等来源轻松同步数据。
- 事务与 binlog:虽不完全支持 ACID,但依然提供事务和 binlog 来保证写入安全。
- 备份恢复:内置工具和 SQL 命令支持数据备份与恢复。
许多知名公司如 Craigslist、Socialgist、PubChem、Rozetka 等,已经使用 Manticore 进行高效搜索和流过滤。
使用
Docker 镜像已上架 Docker Hub:
在 Docker 中快速体验 Manticore Search,只需执行以下命令:
docker run -e EXTRA=1 --name manticore --rm -d manticoresearch/manticore && until docker logs manticore 2>&1 | grep -q "accepting connections"; do sleep 1; done && docker exec -it manticore mysql && docker stop manticore
进入 MySQL 命令行后,就可以像操作普通数据库一样建表、写数据、搜数据:
create table movies(title text, year int) morphology='stem_en' html_strip='1' stopwords='en';
insert into movies(title, year) values ('The Seven Samurai', 1954), ('Bonnie and Clyde', 1954), ('Reservoir Dogs', 1992), ('Airplane!', 1980), ('Raging Bull', 1980), ('Groundhog Day', 1993), ('<a href="http://google.com/">Jurassic Park</a>', 1993), ('Ferris Bueller\'s Day Off', 1986);
select highlight(), year from movies where match('the dog');
select highlight(), year from movies where match('days') facet year;
select * from movies where match('google');
完整文档与源码可移步 GitHub:
如果还想进一步探讨搜索引擎选型或性能优化,欢迎来 云栈社区 和更多开发者一起交流实战经验。