MeiliSearch:用Rust语言编写的极简全文搜索引擎


MeiliSearch是一个快速、功能丰富的全文搜索引擎。它建立在LMDB键值存储之上,安装在 Ubuntu 或 MacOS 上时作为 35 MB 的二进制文件存在。它带有内置的客户端、服务器和 WebUI。词干提取、停用词、同义词、排名、过滤器和分面等功能都是开箱即用的,使用合理的默认值并且可以轻松定制。
MeiliSearch 项目始于 2018 年,大部分早期代码由 Clément Renault 编写。Clément 后来创立了 Meil​​i,这是一家总部位于巴黎的公司,提供有关此产品的服务。据领英称,他们目前雇佣了 18 名员工。
MeiliSearch代码库不包括单元测试,它由 7,600 行 Rust 组成。
尽管竞争产品通常具有更多功能,但 Elasticsearch由近 200 万行 Java 组成,使用Apache Lucene 的[url=https://solr.apache.org/]Apache Solr[/url]大约有 130 万行 Java,Groonga60 万多行 C 组成,Manticore Search是由 150K 行 C++ 组成,Sphinx由 100K 行 C++ 组成,Typesense由 50K 行 C++ 组成,包括头文件,Tantivy也是用 Rust 编写的,有 40K 行代码。
这个看似很小的代码库背后的原因之一是关注的领域已被分解为单独的存储库。indexer mill位于 17K 行的 Rust,tokenizer有 1,200 行,WebUI仪表板是一个 3.5K 行的 React 应用程序。
开发人员已经竭尽全力避免使用 3rd 方库重新发明轮子:
这些措施包括 heed,他们用来包LMDB, Tokio是用于网络,Actix的是自己的Web框架, futures用于流媒体功能和parking_lot手柄锁定和同步。
这两个 SledRocksDB是考虑为团队LMDB结算前的嵌入式数据库后端的候选人。他们认为 LMDB 是此用例的性能和稳定性的最佳组合。

选择使用 Rust 及其丰富的库生态系统、非冗长的语法和生成高性能二进制文件的能力看起来已经获得了很好的回报。Rust 始于 2006 年 Mozilla 员工 Graydon Hoare 的个人项目。 2020 年,StackOverflow 的一项调查发现 Rust是其受访者中最受欢迎的编程语言。
 
MeiliSearch搜索有六个默认的排名规则。

  1. 错别字优先考虑与您的查询词匹配且错别字最少的文档。
  2. words将包含所有查询词的文档优先于仅匹配其中一些词的文档。
  3. 邻近度优先考虑您的搜索查询词彼此最接近的文档。
  4. 属性优先考虑您的搜索查询匹配的字段。如果您有标题、描述和作者属性排名顺序,则标题字段中的匹配项将比描述或作者字段中的匹配项具有更大的权重。
  5. 单词位置优先考虑您的搜索词出现在最接近字段开头的文档。
  6. 精确性优先考虑与您的查询最接近的文档。

这些可以通过发布到排名规则端点来进一步扩展、删除和/或重新排列。此设置是特定于索引的。
MeiliSearch 的数据库默认情况下,它限制为 100 GB。这可以通过在启动时传递覆盖参数来更改。还有 200 个索引的硬编码限制,并且只会索引任何属性的前 1,000 个单词。