当前位置: 首页 > news >正文

别再死磕 Elasticsearch 了,这个轻量级搜索引擎更香

01 引言

这段时间一直在做紧急项目,有一个类似朋友圈的功能,需要查询发布的内容。第一印象跟肯定是全文检索了,全文检索最常用的就是Elasticsearch或者Solr

之前分享过一篇关于Manticore Search的文章,但是一直没有使用。这次就深度使用一下。它比Elasticsearch轻量得多,性能却不虚,而且SQL支持做得比 ES 好太多。

02 Manticore Search 简介

Manticore Search是一个高性能、多功能的搜索引擎数据库,专门为搜索和数据分析场景打造。它的前身是 Sphinx Search,2017 年正式独立出来并进行了完全重写。它兼具以下特性:

  • 高性能全文搜索:全文检索性能优异,支持超过 20 种全文运算符和 20+ 排名因子
  • 实时索引:新增或更新的文档可以立即被读取,无需等待定时任务
  • 向量搜索:支持嵌入向量最近邻搜索,可构建语义搜索、相似推荐等能力
  • 列式存储:可选的列式存储,大幅降低大数据集的内存占用
  • 双协议支持:原生支持SQL(MySQL 协议/HTTP SQL)和 HTTP JSON 协议
  • 水平扩展:支持Galera多主复制,可横向扩展

Manticore Search开源免费,核心由 C++ 编写,启动极快,内存占用极低(空实例仅约40MBRSS)。这玩意儿在国内真的被Elasticsearch压得太惨了,没什么人知道。

03 核心功能

3.1 全文检索

全文搜索的关键词是match,输入查询字符串使用与索引文本时相同的设置进行分词。除了输入文本的分词外,查询字符串还支持一系列的 全文操作符,这些操作符会强制执行各种规则,以确保关键词能够提供有效的匹配。

全文匹配子句可以与属性 过滤器 结合使用,作为 AND 布尔运算。全文匹配和属性过滤器之间的 OR 关系不被支持。

SELECT子句中最多只能有一个MATCH()。还可以支持JOIN查询。

主要的功能如下:

  • 模糊搜索(Fuzzy Search):自动纠正用户拼写错误
  • 自动补全(Autocomplete):支持前缀和短语补全
  • 同义词(Synonyms)词形还原(Stemming/Lemmatization)
  • 中文分词:支持准确的中文分割
  • 高亮(Highlighting):搜索结果关键词高亮
  • 自定义排名:支持自定义排序规则

3.2 向量搜索

可以将机器学习模型生成的向量嵌入添加到文档中,执行最近邻(KNN)搜索,适用于:

  • 语义搜索
  • 相似内容推荐
  • 图片、视频、音频的相似性搜索

3.3 结构化查询

除了全文搜索,Manticore Search 还支持:

  • 范围过滤(Range):如id < 100
  • 布尔过滤(BoolFilter):组合多个条件(must/must_not/should)
  • JOIN 查询:跨表关联查询
  • 聚合统计:faceted search 等

3.4 存储模式

Manticore提供行存储和列存储选项,以适应不同规模的数据集。行存储是大家最常用的存储模式,如Mysql等,而列式存储被称之为newSQL,如StarrocksClickHourseTiDB等分布式数据库。

04 基于Match的实践

Manticore的部署非常简单,直接使用Docker部署即可。

dockerpull manticoresearch/manticoredockerrun--namemanticore-p9306:9306-p9308:9308-p9312:9312-dmanticoresearch/manticore

4.1 准备工作

我们以Java客户端为例,因为对应的依赖:

<dependency><groupId>com.manticoresearch</groupId><artifactId>manticoresearch</artifactId><version>8.1.0</version><scope>compile</scope></dependency>

客户端:

ApiClientapiClient=Configuration.getDefaultApiClient();apiClient.setBasePath("http://ip:9308");

所有API操作都通过ApiClient发起,9308Manticore Search的默认 HTTP 端口(SQLJSON协议共用)。

造数据。使用AI造了10W条数据:

4.2 SQL 查询

直接使用SQL查询。

ApiClientapiClient=Configuration.getDefaultApiClient();apiClient.setBasePath("http://127.0.0.1:9308");UtilsApiutilsApi=newUtilsApi(apiClient);Stringsql=""" select * from blogs where match('Docker') and id < 100 """;SqlResponseresponse=utilsApi.sql(sql,true);ObjectactualInstance=response.getActualInstance();// 解析json数据Stringjson=JSON.toJSONString(actualInstance);List<JSONObject>jsonObjects=JSON.parseArray(json,JSONObject.class);Stringdata=jsonObjects.get(0).getString("data");List<JSONObject>dataList=JSON.parseArray(data,JSONObject.class);for(JSONObjectjsonObject:dataList){System.out.println(jsonObject);}

解析:

  • 使用UtilsApi.sql()执行原始 SQL 语句
  • match('Docker')是 Manticore Search 的全文搜索语法,表示在全文索引字段中搜索包含 “Docker” 的文档且ID小于100的记录
  • 使用JSON解析最终的记录

结果:

图像化界面结果:

4.3SearchApi

除了使用SQL,还可以使用API的方式直接调用,有点类似ESAPI

ApiClientapiClient=Configuration.getDefaultApiClient();apiClient.setBasePath("http://127.0.0.1:9308");SearchApisearchApi=newSearchApi(apiClient);SearchQuerysearchQuery=newSearchQuery();Map<String,Object>match=newHashMap<>();match.put("content","Docker");Map<String,Object>rangeItem=newHashMap<>();rangeItem.put("lt",100);Map<String,Object>range=newHashMap<>();range.put("id",rangeItem);BoolFilterboolFilter=newBoolFilter();QueryFilterqueryFilter=newQueryFilter();queryFilter.setMatch(match);boolFilter.addMustItem(queryFilter);QueryFilterqueryFilter2=newQueryFilter();queryFilter2.setRange(range);boolFilter.addMustItem(queryFilter2);searchQuery.setBool(boolFilter);SearchRequestsearchRequest=newSearchRequest();searchRequest.setTable("blogs");searchRequest.setQuery(searchQuery);SearchResponseresponse=searchApi.search(searchRequest);System.out.println("总命中: "+response.getHits().getTotal());System.out.println("list: "+JSON.toJSONString(response.getHits().getHits()));

解析:

  • 这该示例展示了如何组合多个过滤条件
  • BoolFilter支持四种逻辑组合:
    • must:所有条件都必须满足(AND)
    • must_not:所有条件都不能满足(NOT)
    • should:满足任一条件即可(OR)
    • filter:同 must,但不参与评分
  • 本例中addMustItem()添加了两个必须同时满足的条件:
    1. content字段匹配 “Docker”
    2. id字段小于 100

结果:

其中结果集里面包含了_score,表示命中的椎确分数。

类似ESAPI:

curl-sXPOST http://localhost:9308/search-d'{"table":"blogs","query":{"bool":{"must":[{"match":{"content":"Docker"}},{"range":{"id":{"lt":100}}}]}}}

4.4 Mysql和Manticore的速度

我们可以看一下普通的like查询和Manticorematch的速度对比,同样10W条数据。

Mysql的查询结果:

差不多耗时:142ms

Manticore结果:

差不多耗时:14ms

两者相差有10倍。

05 小结

Manticore Search的客户端可以使用DBeaver,之前的版本是不能使用的,打开直接报错,主要因为别名的问题。后面已经修复。相关的issues

https://github.com/manticoresoftware/manticoresearch/issues/1130

Manticore Search是一个被严重低估的搜索引擎,国内用户依然还是首选ES,如果你也在寻找替代方案,不妨了解一下这个产品。

http://www.zskr.cn/news/1346981.html

相关文章:

  • 利用Taotoken模型广场为不同应用场景选择性价比最优模型
  • AI图层分离工具layerdivider:5分钟将单张插画变分层PSD的完整指南
  • 终极指南:如何在Android手机上一键部署so-vits-svc歌声转换模型
  • Gemini GDPR落地实战手册(含欧盟EDPB最新判例解读)
  • 18 CLIP 论文精读:ViT 如何走向图文多模态?(Learning Transferable Visual Models From Natural Language Supervision)
  • 【ChatGPT×Slack企业级整合实战指南】:20年SRE亲授零代码接入、权限治理与合规审计全流程
  • 面试必问:RAG准确率提升实战:从60%到85%的全链路优化
  • 如何快速掌握JSON对比工具:终极效率提升指南
  • 在openEuler上安装nginx
  • Claude Code 用户如何通过 Taotoken 解决访问限制与 Token 不足问题
  • 你的游戏PC变成云游戏服务器:Sunshine游戏串流实战指南
  • 2026年集装箱房活动房厂家实力测评排名!7大源头工厂深度解析,采购不踩坑 - 博客万
  • 人工智能培训-武汉第二天
  • 前端性能分析工具利器
  • 通过curl命令直接测试Taotoken多模型API的响应与兼容性
  • RAG 开源项目排行榜(2026 年 5 月)
  • G-Helper终极指南:5分钟让你的华硕笔记本告别臃肿,性能翻倍
  • 电商跨境专属!2026海南电商、跨境企业专业税务咨询机构优选 - 速递信息
  • My-TODOs:5分钟快速上手的免费跨平台桌面待办清单终极指南
  • ANI-RSS自定义扩展技术深度解析:架构设计与高级定制方案
  • 3分钟快速上手:R3nzSkin国服换肤神器完全指南
  • 为什么你的Veo 4K输出只有2K质量?深度拆解Veo 2.3引擎中的3层分辨率欺骗机制与绕过方案
  • 动物森友会存档编辑器NHSE:5分钟上手终极指南
  • 使用taotoken聚合api后模型响应延迟与稳定性的实际体感观察
  • Godot纸牌游戏框架:分层架构与卡牌状态管理
  • LiteLLM 企业级部署实战:5 后端 38 模型统一 AI 网关
  • 如何高效构建跨平台三星固件工具:Bifrost技术架构深度解析
  • 如何用AI一键智能分层:Layerdivider让插画秒变可编辑PSD
  • 2026降AIGC技术白皮书:全网工具实测雷达图与智能选型助手
  • Java编程入门科普:从“一杯咖啡”到亿万应用