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次

MIT 许可证

56KB
1K SLoC

Docs Join the chat at https://discord.gg/MT27AG5EVE License: MIT Crates.io

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

我们将初始化索引并创建其模式。模式定义了您字段的列表,以及每个字段

  • 其名称
  • 其类型,目前为 u64i64str
  • 应该如何被索引。

更多关于后者的信息可以在 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