Rust Sonic安装和使用,比Elasticsearch更轻量级的搜索引擎

Sonic是一种快速,轻量级且无模式的搜索后端。它吸收了搜索文本和标识符元组,然后可以在一微秒的时间内对其进行查询。
在某些用例中,Sonic可以用作超重且功能齐全的搜索后端(例如Elasticsearch)的简单替代。
https://github.com/valeriansaliou/sonic

Sonic是用Rust编写的,支持的安装方式非常多。可以从源码安装、从docker安装,也可以直接下载编译好的二进制文件。在这里笔者将充当搬运工的角色,将安装方法从官方文档中搬运过来。

安装


方法一、从源码安装

需要提前用git将源代码clone到本地,并且已提前安装好rust。

cargo build --release

执行编译命令后,你可以在./target/release目录里面找到生成二进制可执行文件。
Sonic使用RocksDB作为存储,因此在编译前,你需要安装一些依赖:clang, clang-dev, g++ 和 llvm-dev。

方法二、使用 cargo install 命令安装

需要你提前安装好rust环境。

cargo install sonic-server

方法三、从Docker Hub安装

docker pull valeriansaliou/sonic:v1.3.0

从docker运行:

docker run -p 1491:1491 -v /path/to/your/sonic/config.cfg:/etc/sonic.cfg -v /path/to/your/sonic/store/:/var/lib/sonic/store/ valeriansaliou/sonic:v1.3.0

方法四、在macOS使用Homebrew安装

brew install sonic

方法五、下载已经编译好的二进制文件安装

从github的release页面可以下载:https://github.com/valeriansaliou/sonic/releases
下载好后解压就可以了。

运行Sonic服务端

./sonic -c /path/to/config.cfg
(INFO) - starting up
(INFO) - started
(DEBUG) - spawn managed thread: tasker
(DEBUG) - spawn managed thread: channel
(INFO) - tasker is now active
(INFO) - listening on tcp://0.0.0.0:1491

在运行前配置文件有个地方是必须要修改的,不然在当前的设备网络环境下,你可能无法使用。打开配置文件,找到inet = "[::1]:1491"这一行,将其改成inet = "0.0.0.0:1491"。因为配置文件中默认采用的是IPv6的方式,我们要改成IPv4,不然你可能无法使用他。

连接Sonic服务端

Sonic采用TCP原始协议来通讯的,因此可以用telnet命令来连接Sonic,充当Sonic客户端。

telnet 127.0.0.1 1491

连接成功后,要马上进行登录认证。密码在配置文件中,auth_password的值就是认证密码,默认为SecretPassword。 比如以search身份登录,在telnet后,输入以下指令:

START search SecretPassword

当返回Sonic服务端版本信息的时候,则表示登录成功了。输入QUIT按回车即可退出。
登录成功后返回的大致内容如下:

telnet 127.0.0.1 1491
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
CONNECTED <sonic-server v1.3.0>
START search SecretPassword
STARTED search protocol(1) buffer(20000)

添加文档到Sonic

T1: telnet sonic.local 1491
T2: Trying 127.0.0.1...
T3: Connected to sonic.local.
T4: Escape character is '^]'.
T5: CONNECTED <sonic-server v1.0.0>
T6: START ingest SecretPassword
T7: STARTED ingest protocol(1) buffer(20000)
T8: PUSH messages user:0dcde3a6 conversation:71f3d63b Hey Valerian
T9: ERR invalid_format(PUSH <collection> <bucket> <object> "<text>")
T10: PUSH messages user:0dcde3a6 conversation:71f3d63b "Hello Valerian Saliou, how are you today?"
T11: OK
T12: COUNT messages user:0dcde3a6
T13: RESULT 43
T14: COUNT messages user:0dcde3a6 conversation:71f3d63b
T15: RESULT 1
T16: FLUSHO messages user:0dcde3a6 conversation:71f3d63b
T17: RESULT 1
T18: FLUSHB messages user:0dcde3a6
T19: RESULT 42
T20: PING
T21: PONG
T22: QUIT
T23: ENDED quit
T24: Connection closed by foreign host.

T8: PUSH 指令就是往Sonic中添加文档。其语法是PUSH <collection> <bucket> <object> "<text>" [LANG(<locale>)]?
[]?中的内容表示为可选。

检索文档

T1: telnet sonic.local 1491
T2: Trying 127.0.0.1...
T3: Connected to sonic.local.
T4: Escape character is '^]'.
T5: CONNECTED <sonic-server v1.0.0>
T6: START search SecretPassword
T7: STARTED search protocol(1) buffer(20000)
T8: QUERY messages user:0dcde3a6 "valerian saliou" LIMIT(10)
T9: PENDING Bt2m2gYa
T10: EVENT QUERY Bt2m2gYa conversation:71f3d63b conversation:6501e83a
T11: QUERY helpdesk user:0dcde3a6 "gdpr" LIMIT(50)
T12: PENDING y57KaB2d
T13: QUERY helpdesk user:0dcde3a6 "law" LIMIT(50) OFFSET(200)
T14: PENDING CjPvE5t9
T15: PING
T16: PONG
T17: EVENT QUERY CjPvE5t9
T18: EVENT QUERY y57KaB2d article:28d79959
T19: SUGGEST messages user:0dcde3a6 "val"
T20: PENDING z98uDE0f
T21: EVENT SUGGEST z98uDE0f valerian valala
T22: QUIT
T23: ENDED quit
T24: Connection closed by foreign host.

T8: QUERY 就是搜索查询指令。其语法是:QUERY <collection> <bucket> "<terms>" [LIMIT(<count>)]? [OFFSET(<count>)]? [LANG(<locale>)]?
T9: 这一行返回的是 QUERY 指令的等待消息 ID
T10: 该行是 QUERY 的查询结果。其中的 id 需要与 T9的 PENDING ID 是对应的。

更多的 TCP 原始协议指令使用可以参考官方文档。后面笔者会以代码的形式在 Java 或在 Rust 中编写 Sonic 的客户端,以编码的形式实现文档的存储与查询。

本博客采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可

本文标题:Rust Sonic安装和使用,比Elasticsearch更轻量级的搜索引擎

本文地址:https://dev-tang.com/post/2020/07/rust-sonic.html

推荐阅读