1 个不稳定版本
使用旧版 Rust 2015
0.1.0 | 2018年10月18日 |
---|
#237 in 数据库实现
74KB
1.5K SLoC
托西
基于 Tantivy 的 Rust 全文搜索引擎
描述
托西旨在成为一个类似于 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