18个版本 (重大更改)
0.22.1 | 2024年4月19日 |
---|---|
0.21.0 | 2023年9月18日 |
0.19.0 | 2022年12月12日 |
0.15.0 | 2021年6月7日 |
0.1.1 | 2016年8月14日 |
#7 in 数据库实现
每月下载 23次
56KB
1K SLoC
tantivy-cli
tantivy-cli
是搜索引擎 tantivy 的命令行界面。它提供索引和搜索功能,适合小型项目。
如果您需要一个围绕 tantivy 的更完整的解决方案,您可以使用
教程:使用Tantivy CLI索引维基百科
简介
在这个教程中,我们将创建一个全新的索引,其中包含英文维基百科的文章。
安装 tantivy CLI。
安装 tantivy-cli
有几种方法。
如果您是 Rust 程序员,您可能已经安装了 cargo
,只需运行 cargo install tantivy-cli
创建索引: new
现在,让我们创建一个目录,用于存储索引。
# create the directory
mkdir wikipedia-index
我们将初始化索引并创建其模式。模式定义了您字段的列表,以及每个字段
- 其名称
- 其类型,目前为
u64
、i64
或str
- 应该如何被索引。
更多关于后者的信息可以在 tantivy 的模式文档页面 上找到
在我们的案例中,我们的文档将包含
- 一个标题
- 一个正文
- 一个 URL
我们希望标题和正文被分词和索引。我们还希望将词频和词位置添加到我们的索引中。
运行 tantivy new
将启动一个向导,帮助您定义新索引的模式。
像所有其他 tantivy
命令一样,您必须通过 -i
或 --index
参数传递索引目录,如下所示
tantivy new -i wikipedia-index
按以下方式回答问题
Creating new index
Let's define its schema!
New field name ? title
Choose Field Type (Text/u64/i64/f64/Date/Facet/Bytes) ? Text
Should the field be stored (Y/N) ? Y
Should the field be indexed (Y/N) ? Y
Should the term be tokenized? (Y/N) ? Y
Should the term frequencies (per doc) be in the index (Y/N) ? Y
Should the term positions (per doc) be in the index (Y/N) ? Y
Add another field (Y/N) ? Y
New field name ? body
Choose Field Type (Text/u64/i64/f64/Date/Facet/Bytes) ? Text
Should the field be stored (Y/N) ? Y
Should the field be indexed (Y/N) ? Y
Should the term be tokenized? (Y/N) ? Y
Should the term frequencies (per doc) be in the index (Y/N) ? Y
Should the term positions (per doc) be in the index (Y/N) ? Y
Add another field (Y/N) ? Y
New field name ? url
Choose Field Type (Text/u64/i64/f64/Date/Facet/Bytes) ? Text
Should the field be stored (Y/N) ? Y
Should the field be indexed (Y/N) ? N
Add another field (Y/N) ? N
[
{
"name": "title",
"type": "text",
"options": {
"indexing": "position",
"stored": true
}
},
{
"name": "body",
"type": "text",
"options": {
"indexing": "position",
"stored": true
}
},
{
"name": "url",
"type": "text",
"options": {
"indexing": "unindexed",
"stored": true
}
}
]
向导完成后,应在 wikipedia-index/meta.json
中存在一个 meta.json
文件。这是一个相当易读的 JSON,因此您可以检查其内容。
它包含两个部分
- 段(目前为空,但我们将很快更改它)
- 模式
索引文档: index
Tantivy 的 index
命令提供了一种索引 JSON 文件的方法。该文件必须每行包含一个 JSON 对象。该 JSON 对象的结构必须与我们的模式定义相匹配。
{"body": "some text", "title": "some title", "url": "http://somedomain.com"}
对于本教程,您可以从这里下载一个语料库,其中包含 500 万以上的英文维基百科文章,格式正确:[wiki-articles.json (2.34 GB)](https://www.dropbox.com/s/wwnfnu441w1ec9p/wiki-articles.json.bz2?dl=0)。请确保解压文件。另外,如果您已安装 bzcat
,则可以避免此步骤,以便您可以直接读取压缩文件。
bunzip2 wiki-articles.json.bz2
如果您需要加快速度,可以从这里下载 100 篇正确格式的文章(11 MB):[100 篇文章](http://fulmicoton.com/tantivy-files/wiki-articles-1000.json)。
index
命令将索引您的文档。默认情况下,它将使用 3 个线程,每个线程的缓冲区大小为 1GB,并分配给这些线程。
cat wiki-articles.json | tantivy index -i ./wikipedia-index
您可以通过传递 -t
参数来更改线程数,并通过使用 -m
来使用线程堆的总缓冲区大小。请注意,tantivy 的内存使用量大于仅此缓冲区大小参数。
在我的计算机上(8 核 Xeon(R) CPU X3450 @ 2.67GHz),在 8 个线程上,索引维基百科大约需要 9 分钟。
在 tantivy 索引时,您可以查看索引目录以检查正在发生的情况。
ls ./wikipedia-index
主要文件是 meta.json
。
您还应看到许多以 UUID 作为文件名,并具有不同扩展名的文件。实际上,我们的索引被分为段。每个段相当于一个较小的独立索引。其名称只是一个 uuid。
如果您决定索引完整的维基百科,您还可能看到一些这些文件消失。拥有过多的段可能会影响搜索性能,因此 tantivy 实际上会自动开始合并段。
提供搜索索引: serve
Tantivy 的 CLI 也内置了搜索服务器。您可以使用以下命令运行它。
tantivy serve -i wikipedia-index
默认情况下,它将在端口 3000
上提供服务。
您可以通过访问以下 url 在浏览器中搜索查询 Barack Obama
的前 20 个最相关文档。
https://127.0.0.1:3000/api/?q=barack+obama&nhits=20
默认情况下,此查询被视为 barack OR obama
。您也可以通过在查询中的术语前添加 +
符号来搜索包含两个术语的文档。
https://127.0.0.1:3000/api/?q=%2Bbarack%20%2Bobama&nhits=20
此外,-
使您能够删除包含特定术语的文档。
https://127.0.0.1:3000/api/?q=-barack%20%2Bobama&nhits=20
最后,tantivy 可以处理短语查询。
https://127.0.0.1:3000/api/?q=%22barack%20obama%22&nhits=20
通过命令行搜索索引
您还可以使用 search
命令来流式传输所有与特定查询匹配的文档。文档以未指定的顺序返回。
tantivy search -i wikipedia-index -q "barack obama"
tantivy search -i hdfs --query "*" --agg '{"severities":{"terms":{"field":"severity_text"}}}'
基准测试索引: bench
Tantivy 的 CLI 提供了一个简单的基准测试工具。您可以使用以下命令运行它。
tantivy bench -i wikipedia-index -n 10 -q queries.txt
依赖关系
~30MB
~533K SLoC