V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vus520
V2EX  ›  分享发现

分享一个基于 Rust 的搜索引擎 MeiliSearch

  •  
  •   vus520 · 2021-01-12 12:14:52 +08:00 · 2217 次点击
    这是一个创建于 1369 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    主页

    https://github.com/meilisearch/MeiliSearch

    文档

    https://docs.meilisearch.com/

    上周发现 MeiliSearch 已经支持中文分词,于是进行了深入的调研。

    (旁白,回头找老外问问,他们咋给项目起了一个中文名叫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

    +## 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
    

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

    首发地址

    https://www.4wei.cn/archives/1002848

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3553 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:20 · PVG 18:20 · LAX 03:20 · JFK 06:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.