# 构建搜索应用

现在你已经安装并运行了Typesense,我们准备创建一个Typesense集合(collection),向其中索引一些文档并进行搜索测试。

# 示例数据集

为了便于学习,请下载 (opens new window)我们为本次教程准备的小型数据集。

cd /tmp
curl -O https://dl.typesense.org/datasets/books.jsonl.gz
gunzip books.jsonl.gz

执行上述命令后,你将获得一个名为books.jsonl的文件,我们将在后续步骤中使用它。

# 初始化客户端

首先通过指向一个 Typesense 节点来配置 Typesense 客户端。

  • 请确保使用与之前启动 Typesense 服务器时相同的 API 密钥。
  • 或者如果您使用的是 Typesense Cloud,点击集群页面上的"Generate API key"按钮。这将为您提供一组主机名和 API 密钥以供使用。

对于每个字段,我们定义了它的 name(名称)、type(类型)以及是否为 facet(分面)字段。分面字段允许我们将搜索结果聚类成类别,并可以深入查看每个类别。在本指南的最后部分,我们将看到分面搜索的实际应用。

我们还定义了 default_sorting_field(默认排序字段),用于在未提供 sort_by 子句时确定结果的排序方式。在本例中,评分数量更多的书籍将排在更前面。

索引字段与非索引字段

集合模式中只需要包含您想要搜索/过滤/分面/排序/分组的字段,我们称之为索引字段。索引字段存储在内存中,并在磁盘上有备份。

在将文档导入 Typesense 时,您仍然可以发送用于展示目的的其他字段(例如:图片 URL)。任何未在模式中提及但存在于导入文档中的字段,将仅存储在磁盘上,并在文档匹配时返回。 我们称这些为非索引字段,这有助于节省内存使用,并避免为这些字段在内存中构建未使用的索引而浪费 CPU 周期。

# 向集合中添加书籍

现在我们已经准备好将一些书籍数据索引到刚刚创建的集合中。

# 搜索书籍

我们将从一个非常简单的搜索查询开始 - 让我们搜索 harry potter 并让 Typesense 将评分数量更多的书籍排在结果的前面。

# 示例响应

除了返回匹配的文档外,Typesense 还会通过 highlight 属性高亮显示查询词在文档中出现的位置。

想要实际看到最新的 harry potter 书籍优先返回?没问题,我们可以将 sort_by 子句改为 publication_year:desc

# 语义搜索

Typesense 还支持在关键词匹配之外返回语义匹配结果。

例如,如果你的数据集中包含单词 "Harry Potter",而用户搜索的是 "famous boy wizard",语义搜索会返回包含 "Harry Potter" 的记录,因为它在概念上与搜索词相关。

在专门的指南文章中了解更多关于语义搜索的信息。

# 结果过滤

现在,让我们调整查询条件,只获取出版年份在1998年之前的书籍。要实现这个功能,只需在查询中添加一个 filter_by 子句:

# 示例响应

# 分面搜索

让我们通过作者字段对搜索结果进行分面处理,看看效果如何。同时,我们也将用这个例子来了解 Typesense 如何处理拼写错误。让我们搜索 experyment(注意这个拼写错误!)。

从下面的结果可以看出,Typesense 优雅地处理了这个拼写错误并正确获取了结果。facet_by 子句还为我们提供了返回搜索结果中每位作者所著书籍数量的清晰分类。

# 示例响应

我们的快速入门指南到此结束。如需深入了解 Typesense,请参阅我们的 API 文档

TIP

本示例中我们使用了单节点模式,但 Typesense 也可以运行在集群模式下。更多细节请查看 高可用性 章节。