1 个不稳定版本

使用旧版 Rust 2015

0.1.0 2018年10月18日

#237 in 数据库实现

MIT 许可协议

74KB
1.5K SLoC

托西

基于 Tantivy 的 Rust 全文搜索引擎

dependency status License: MIT Build Status codecov Coverage Status

描述

托西旨在成为一个类似于 ElasticSearch 的全文搜索引擎。理想情况下,如果 Tantivy 对于 Lucene 是什么,那么 Toshi 力求成为 ElasticSearch 的那个。

动机

托西将始终针对稳定的 Rust,并将尽最大努力不使用任何不安全的功能。尽管底层库可能使用一些不安全的功能,但托西将努力审查这些库,以努力做到完全不使用不安全 Rust。我选择这样做的原因是我认为,为了真正成为人们考虑的吸引人选择,它必须安全、稳定和一致。这就是为什么选择稳定 Rust 的原因,因为它提供了保证和安全。我不想陷入使用夜间功能的兔子洞,然后遇到它们稳定性的问题。由于托西不是一个库,我对此要求感到非常满意,因为想要使用这个库的人很可能会将其取下来使用,而不会对其进行修改。因此,我的动机是针对构建托西时的情况。

构建要求

目前,托西应在 Windows、OSX 和 Linux 上构建并正常工作。您需要 Rust >= 1.27 和已安装 cargo 来构建。

配置

在 config/config.toml 中有一个默认配置

host = "localhost"
port = 8080
path = "data/"
writer_memory = 200000000
log_level = "debug"
json_parsing_threads = 4
bulk_buffer_size = 10000
auto_commit_duration = 10

[merge_policy]
kind = "log"
min_merge_size = 8
min_layer_size = 10_000
level_log_size = 0.75
主机

host= "localhost"

这是 Toshi 启动时将绑定在其上的本地主机名。

端口

port= 8080

启动时 Toshi 将绑定的端口。

路径

path= "data/"

这是 Toshi 存储数据和索引的数据路径。

写入器内存

writer_memory= 200000000

这是 Toshi 应分配给新文档提交的字节数。

日志级别

log_level= "info"

这是 Toshi 日志的信息级别。

JSON 解析

json_parsing_threads= 4

当 Toshi 执行文档的批量导入时,它将启动多个线程来解析接收到的文档 JSON。这控制了处理此任务的线程数量。

批量缓冲区

bulk_buffer_size= 10000

这将控制将文档解析到索引中的缓冲区大小。它将通过阻塞消息缓冲区填满时来控制批量摄取所占用的内存量。如果您想完全偏离轨道,可以将此值设置为0以使缓冲区无界。

自动提交持续时间

auto_commit_duration= 10

此选项控制索引在有要提交的文档时自动提交文档的频率。将此值设置为0将禁用此功能,但您在提交文档时必须自己执行提交。

合并策略
[merge_policy]
kind = "log"

Tantivy将根据以下配置合并索引段。此选项有2种。默认的段合并行为是"log"。Log有3个附加值。这三个值中的任何一个都可以省略以使用Tantivy的默认值。默认值如下所示。

min_merge_size = 8
min_layer_size = 10_000
level_log_size = 0.75

此外,还有一个"nomerge"选项,其中Tantivy将不合并任何段。

构建和运行

可以使用cargo build --release构建Toshi。一旦从顶级目录构建了Toshi,您可以通过运行target/release/toshi来根据config/config.toml中的配置启动Toshi。

您应该会收到这样的启动信息。

  ______         __   _   ____                 __
 /_  __/__  ___ / /  (_) / __/__ ___ _________/ /
  / / / _ \(_-</ _ \/ / _\ \/ -_) _ `/ __/ __/ _ \
 /_/  \___/___/_//_/_/ /___/\__/\_,_/_/  \__/_//_/
 Such Relevance, Much Index, Many Search, Wow
 
 INFO  toshi::index > Indexes: []
 INFO  gotham::start >  Gotham listening on http://[::1]:8080 with 12 threads

您可以使用以下命令验证Toshi是否正在运行:

curl -X GET https://127.0.0.1:8080/

应该返回

Toshi Search, Version: 0.1.0

一旦Toshi启动并运行,我们可以创建一个索引。Toshi使用Tantivy,因此创建索引需要Tantivy模式。下面是一个简单的示例。

curl -X PUT \
  https://127.0.0.1:8080/test_index \
  -H 'Content-Type: application/json' \
  -d '[
    {
      "name": "test_text",
      "type": "text",
      "options": {
        "indexing": {
          "record": "position",
          "tokenizer": "default"
        },
        "stored": true
      }
    },
    {
      "name": "test_i64",
      "type": "i64",
      "options": {
        "indexed": true,
        "stored": true
      }
    },
    {
      "name": "test_u64",
      "type": "u64",
      "options": {
        "indexed": true,
        "stored": true
      }
    }
  ]'

如果一切顺利,我们应该会从这个请求中收到201 CREATED,如果您查看配置的数据目录,您现在应该会看到您刚刚创建的test_index目录。

现在我们可以向索引中添加一些文档。如果用户不想在每次添加文档时提交,可以省略选项字段,但为了完整性,这里包含它。

curl -X PUT \
  https://127.0.0.1:8080/test_index \
  -H 'Content-Type: application/json' \
  -d '{
        "options": { "commit": true },
        "document": {
          "test_text": "Babbaboo!",
          "test_u64": 10,
          "test_i64": -10
        }
    }'

最后,我们可以通过简单的get调用检索索引中的所有文档

curl -X GET https://127.0.0.1:8080/test_index -H 'Content-Type: application/json'

运行测试

cargotest

什么是Toshi?

Toshi是一只三岁的柴犬。它是一个非常乖巧的男孩,是这个项目的官方吉祥物。Toshi在将代码提交到这个存储库之前会亲自审查所有代码,并且只接受人类最高的质量贡献。不过,它会接受小零食以简化代码审查。

依赖项

~29–41MB
~649K SLoC