MeiliSearch 从入门到不精通

MeiliSearch 是近两年开源的一个项目,主要目标是在小数据规模下实现比 ES 更加快速和易用的搜索体验。

主页

https://github.com/meilisearch/MeiliSearch

文档

https://docs.meilisearch.com/

上周发现 MeiliSearch 已经支持中文分词

https://blog.meilisearch.com/v0-18-0/

(旁白,回头找老外问问,他们咋给项目起了一个中文名叫Meili?)

https://github.com/meilisearch/MeiliSearch/issues/1182
Meili 是挪威神话中的神,指“可爱的人”,是奥丁神之子,托尔神的兄弟。

MeiliSearch 支持的功能如下

  1. 开源
  2. 用户量(开源搜索引擎第二名)
  3. 中文分词
  4. 同义词
  5. 纠错
  6. 高亮
  7. 全文返回
  8. 高级搜索
  9. 停用词、停用字段
  10. 加权、降权
  11. 逻辑搜索
  12. 唯一字段聚合
  13. 分页
  14. 重新索引(覆盖)

我们目前在用 OpenSearch,同时也在尝试跟 kalasearch 进行沟通。卡拉搜索是一个新的搜索服务创业公司,可能是因为公司规模小人手不够,他们目前只对明确付费的客户服务。

对于搜索引擎来讲,以下几个功能尤其重要

  1. 词库动态索引,卡拉支持新词发现并重新索引,OS 支持自定义词库和内置词库,但需要手工索引,ES 同理
  2. 中文
  3. 同义词
  4. 分页
  5. 复杂的搜索语法
  6. 权重管理
  7. 快速
  8. 易用

ES 做为老牌搜索引擎,功能基本满足,但复杂,重量级,适合大数据量。
Meili 设计目标针对数据在 500GB 左右的搜索需求,极快,单文件,超轻量。

MeiliSearch is a RESTful search API. It aims to be a ready-to-go solution for everyone who wants a fast and relevant search experience for their end-users

Meili 真的做了一个命令就可以完成安装和使用,安装方便,搜索速度飞快。

详细功能可以参考

https://docs.meilisearch.com/#features

Meili 的中文分词功能,刚刚完成开发,并未合并到主分支,所以需要自行编译。
目前支持中文分词的分支是 0.18.0,也许过一段时间 0.18 的预编译包就发布了,各位可以关注一下。

+## v0.18.0
+
+  - Integration with the new tokenizer (#1091)
+  - Fix setting consistency bug (#1128)
+  - Fix attributes to retrieve bug (#1131)
+  - Increase default payload size (#1147)
+  - Improvements to code quality (#1167, #1165, #1126, #1161)
+

编译方法

git clone https://github.com/meilisearch/MeiliSearch.git
cd MeiliSearch
rustup override set stable

如果你还没有安装 Rust,可以自行查找资料,安装 Rust 和包管理器 cargo

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

依赖安装过程比较缓慢,不过好在我有 ClassX Pro,编译过程感觉比 Golang 要慢,不知道是不是我的错觉。

启动命令非常简单

./meilisearch 

Meili 不使用配置文件进行配置,而是使用参数或者环境变量进行控制

https://docs.meilisearch.com/guides/advanced_guides/configuration.html#options

接下来,进行索引和搜索测试

配置索引,索引不需要指定字段和类似,不用担心 ES 的 mapping 冲突问题

curl -d '{
  "uid": "movies",
  "primaryKey": "id"
}' \
http://127.0.0.1:7700/indexes

添加测试数据

curl -X POST 'http://127.0.0.1:7700/indexes/movies/documents'\
  --data @movies.json

做完这一步就可以打开 WebUI http://127.0.0.1:7700 进行搜索测试了

接下来通过接口配置一些同义词

curl -d '{
    "扫黑": [
        "除黑",
        "打黑"
    ],
    "除黑": [
        "扫黑",
        "打黑"
    ],
    "打黑": [
        "除黑",
        "扫黑"
    ],
}' \
http://127.0.0.1:7700/indexes/wechat/settings/synonyms

同义词是单向的,所以这里需要配置多次列表。那么问题来了,如果我有几十万同义词,应该怎么配置呢。
同义词的词林,一般建议使用哈工大的词库,下回我们细讲。

同义词搜索测试

curl -d '{
    "q": "扫黄"
}' \
http://127.0.0.1:7700/indexes/movies/search

今天上午摸鱼结束,下回接着讲词库管理。