MeiliSearch
说起全文检索,在项目开发中,用的最多的就是 ElaticSearch 了,ElaticSearch 是基于 Apache Lucene 开发的全文检索服务,是一个端到端的解决方案,因此,部署和维护都非常复杂。今天介绍的这个全文搜索服务 MeiliSearch,是一个轻量级的全文检索服务,可以快速搭建本地全文搜索,下表中是 MeiliSearch 与 ElasticSearch 的比较。
特性 | Elasticsearch | MeiliSearch |
---|---|---|
可扩展性 | 高度可扩展和分布式 | 轻量级,较少关注扩展性 |
全文搜索 | 先进且强大 | 简单且高效 |
设置 | 更复杂,需要配置 | 简单且快速设置 |
性能 | 高性能,但可能资源密集 | 优化速度,低延迟 |
安全 | 强大的安全功能 | 基本安全功能 |
可扩展性 | 通过插件和脚本高度可扩展 | 可扩展性有限 |
错字容忍 | 基本错字容忍 | 高级错字容忍 |
分析 | 先进的分析能力 | 分析功能有限 |
API | 全面,但更复杂 | 简单直观 |
资源使用 | 需要更多资源 | 轻量级,资源需求少 |
在企业开发中,稳定性很重要,MeiliSearch不支持集群,需要通过 K8S 进行管理,如果出现故障,需要几秒钟时间进行服务的重建,可以应用于可靠性要求不高的业务场景。
核心概念
文档 Document
在MeiliSearch中文档就相当于数据库的表,文档对象中字段名和字段值,通过键值对的形式进行存储。
索引 Index
MeiliSearch中,文档用于存储数据,只有进行索引的文档才能搜索,这里的索引可以理解为数据库中的索引,由于全文检索使用的是反向索引,如果没有索引是无法进行索引,所以搜索的前提就是创建索引。
主键 Primary Key
主键是文档的唯一索引,每个文档都有自己的主键,创建同样主键的文档,后创建的文档会覆盖先创建的文档。
相关性 Relevance
文档相关性指是MeiliSearch返回文档列表时,会根据条件对文档进行排序,以下是排序的规则,MeiliSearch同时支持自定义排序。
匹配词频
- 解释:搜索结果中匹配搜索词次数越多的文档会被优先显示。
- 优先级:最高优先级。
- 示例:如果搜索词是“apple”,包含多个“apple”词的文档会排在前面。
匹配属性
- 解释:匹配的单词在特定的属性(字段)中出现时,相关性更高。
- 优先级:较低优先级。
- 示例:如果搜索词出现在被认为更重要的字段中(如标题字段),相关性会更高。
匹配拼写错误词数
- 解释:匹配的单词中错字(拼写错误)越少,相关性越高。
- 优先级:最低优先级。
- 示例:如果搜索词与文档中的词完全匹配(无错字),则该文档的相关性会更高。
单词接近度
- 解释:匹配的单词在文档中彼此之间的距离越近,相关性越高。
- 优先级:中等优先级。
- 示例:如果搜索词“new york”在文档中连续出现,而不是分散在文档的不同部分,该文档的排名会更高。
用 docker 启动
- 拉取镜像并启动,MEILI_ENV 参数用的 developement,开发不验证 master_key。
docker pull getmeili/meilisearch:v1.8.0docker run -it --rm \-p 7700:7700 \-e MEILI_ENV='development' \-v $(pwd)/meili_data:/meili_data \getmeili/meilisearch:v1.8
- 下载数据并导入,下载数据。
curl \-X POST 'http://localhost:7700/indexes/movies/documents?primaryKey=id' \-H 'Content-Type: application/json' \-H 'Authorization: Bearer aSampleMasterKey' \--data-binary @movies.json
- 进入管理页面 http://localhost:7700/,搜索运行正常
- 下载 Postman API Collection并导入 Postman,参数配置
总结
MeiliSearch配置简单,如果项目想快速搭建全文检索服务可以采用 MeiliSearch,由于 MeiliSearch 目前还不支持集群,对于不能中断的业务不建议使用。