typesense/typesense
GitHub: typesense/typesense
一款用 C++ 构建的轻量级开源搜索引擎,集成了全文检索、向量搜索和 RAG 对话能力,主打低延迟和易用性,可作为 Algolia、Pinecone 和 Elasticsearch 的平替方案。
Stars: 25513 | Forks: 872
Typesense is a fast, typo-tolerant search engine for building delightful search experiences.
开源的 Algolia 替代方案 &
更易用的 ElasticSearch 替代方案

Website |
Documentation |
Roadmap |
Slack Community |
Community Threads |
Twitter
✨ 这里有一些展示了 Typesense 在大型数据集上实际运行的 **实时演示**:
- 搜索来自 MusicBrainz 的 3200 万首歌曲数据集:[songs-search.typesense.org](https://songs-search.typesense.org/)
- 搜索来自 OpenLibrary 的 2800 万本书籍数据集:[books-search.typesense.org](https://books-search.typesense.org/)
- 搜索来自 RecipeNLG 的 200 万份食谱数据集:[recipe-search.typesense.org](https://recipe-search.typesense.org/)
- 搜索来自 Linux 内核的 100 万条 Git 提交信息:[linux-commits-search.typesense.org](https://linux-commits-search.typesense.org/)
- 带有预先输入功能的拼写检查器,包含 33.3 万个英语单词:[spellcheck.typesense.org](https://spellcheck.typesense.org/)
- 电子商务商店浏览体验:[ecommerce-store.typesense.org](https://ecommerce-store.typesense.org/)
- 地理搜索 / 浏览体验:[airbnb-geosearch.typesense.org](https://airbnb-geosearch.typesense.org/)
- 按主题搜索 / 浏览 xkcd 漫画:[xkcd-search.typesense.org](https://xkcd-search.typesense.org/)
- 对 30 万条 HN 评论进行语义 / 混合搜索:[hn-comments-search.typesense.org](https://hn-comments-search.typesense.org)
🗣️ 🎥 如果您更喜欢观看视频:
- 这是一个我们介绍 Typesense 并展示演示 walkthrough 的视频:https://youtu.be/F4m0x_B1AE?t=144
- 查看 Typesense 在 Google I/O 开发者主题演讲中的近期提及:https://youtu.be/qBkyU1TJKDg?t=2399
- 这是一个我们社区成员对 Typesense 进行概述并向您展示端到端演示的视频:https://www.youtube.com/watch?v=kwtHOkf7Jdg
## 快速链接
- [功能特性](#features)
- [性能基准](#benchmarks)
- [路线图](#roadmap)
- [谁在使用](#whos-using-this)
- [安装](#install)
- [快速开始](#quick-start)
- [分步演练](#step-by-step-walk-through)
- [API 文档](#api-documentation)
- [API 客户端](#api-clients)
- [搜索 UI 组件](#search-ui-components)
- [常见问题](#faq)
- [支持](#support)
- [贡献](#contributing)
- [获取最新更新](#getting-latest-updates)
- [从源码构建](#build-from-source)
## 功能特性
- **容错能力:** 开箱即用地优雅处理拼写错误。
- **简单且令人愉悦:** 易于设置、集成、操作和扩展。
- **⚡ 极速:** 使用 C++ 构建。从头开始精心架构,实现低延迟(<50ms)即时搜索。
- **可调排名:** 轻松完善搜索结果排名。
- **排序:** 在查询时根据特定字段动态排序结果(有助于实现“按价格排序(升序)”等功能)。
- **分面与过滤:** 深入挖掘并优化结果。
- **分组与去重:** 将相似结果分组以展示更多样性。
- **联合搜索:** 在单个 HTTP 请求中跨多个集合(索引)进行搜索。
- **地理搜索:** 根据纬度/经度周围或边界框内的结果进行搜索和排序。
- **向量搜索:** 在 Typesense 中索引来自机器学习模型的 embedding,并进行最近邻搜索。可用于构建相似性搜索、语义搜索、视觉搜索、推荐等。
- **语义 / 混合搜索:** 使用内置模型(如 S-BERT, E-5 等)或在查询和索引数据时使用 OpenAI、PaLM API 等,在 Typesense 内部自动生成 embedding。这允许您将 JSON 数据发送到 Typesense 并构建开箱即用的语义搜索 + 关键词搜索体验。
- **对话式搜索(内置 RAG):** 向 Typesense 发送问题,并根据您在 Typesense 中索引的数据获得完整的句子回答。就像 ChatGPT 一样,但是基于您自己的数据。
- **自然语言搜索:** 由 LLM 驱动的意图检测与查询理解,将任何自由格式的自然语言短语转换为结构化过滤器、排序和查询。
- **图片搜索:** 使用内容文本描述搜索图片,或使用 CLIP 模型进行相似性搜索。
- **语音搜索:** 通过录音捕获并发送查询 - Typesense 将转录(通过 Whisper 模型)并提供搜索结果。
- **范围 API 密钥:** 生成仅允许访问特定记录的 API 密钥,适用于多租户应用程序。
- **JOINs:** 通过公共引用字段连接一个或多个集合,并在查询时将它们连接起来。这允许您优雅地建模类似 SQL 的关系。
- **同义词:** 将单词定义为彼此的等价词,因此搜索单词也会返回定义的同义词的结果。
- **策展与商品推广:** 将特定记录提升到搜索结果中的固定位置,以进行展示。
- **基于 Raft 的集群:** 设置高可用的分布式集群。
- **无缝版本升级:** 随着 Typesense 新版本的推出,升级就像交换二进制文件并重启 Typesense 一样简单。
- **无运行时依赖:** Typesense 是一个单一的二进制文件,您可以使用单个命令在本地或生产环境中运行。
**在列表中没有看到某个功能?** 搜索我们的 issue 追踪器,看看是否有人已经请求它,并添加评论说明您的用例,如果没有,请打开一个新的 issue。我们根据用户反馈来确定我们的路线图优先级,因此我们很乐意听取您的意见。
## 路线图
这是 Typesense 的公开路线图:[https://typesense.link/roadmap](https://typesense.link/roadmap)。
第一列还解释了我们如何确定功能优先级、您如何影响优先级以及我们的发布周期。
## 性能基准
- 一个包含 **220 万份食谱**(食谱名称和成分)的数据集:
- 在 Typesense 中索引时占用约 900MB 的 RAM
- 索引所有 220 万条记录耗时 3.6 分钟
- 在具有 4 个 vCPU 的服务器上,Typesense 能够处理 **每秒 104 个并发搜索查询** 的并发量,平均搜索处理时间为 **11ms**。
- 一个包含 **2800 万本书籍**(书名、作者和类别)的数据集:
- 在 Typesense 中索引时占用约 14GB 的 RAM
- 索引所有 2800 万条记录耗时 78 分钟
- 在具有 4 个 vCPU 的服务器上,Typesense 能够处理 **每秒 46 个并发搜索查询** 的并发量,平均搜索处理时间为 **28ms**。
- 对于包含 **300 万个产品**(Amazon 产品数据)的数据集,Typesense 在 8 vCPU 3 节点高可用 Typesense 集群上能够处理 **每秒 250 个并发搜索查询** 的吞吐量。
如果我们能在公共领域找到更大的数据集,我们很乐意对其进行基准测试。如果您对开放的结构化数据集有任何建议,请通过开启 issue 告诉我们。如果您能分享您自己大型数据集的基准测试,我们也会很高兴。请给我们发送 PR!
## 谁在使用?
Typesense 被不同领域和行业的各类用户使用。
在 Typesense Cloud 上,我们每月提供超过 **100 亿次** 搜索。Typesense 的 Docker 镜像已被下载超过 1200 万次。
我们最近开始在我们的 [展示页面](SHOWCASE.md) 中记录谁在使用它。
如果您希望被列入名单,请随时编辑 [SHOWCASE.md](SHOWCASE.md) 并给我们发送 PR。
您还可以在 [Typesense Cloud](https://cloud.typesense.org) 主页上看到用户徽标列表。
## 安装
**选项 1:** 您可以下载我们为 Linux (x86_64 & arm64) 和 Mac (x86_64) 发布的 [二进制包](https://typesense.org/downloads)。
**选项 2:** 您也可以从我们的 [官方 Docker 镜像](https://hub.docker.com/r/typesense/typesense) 运行 Typesense。
**选项 3:** 使用 [Typesense Cloud](https://cloud.typesense.org) 启动托管集群:

## 快速开始
这是一个快速示例,展示了如何在 Typesense 上创建集合、索引文档并对其进行搜索。
让我们首先通过 Docker 启动 Typesense 服务器:
```
docker run -p 8108:8108 -v/tmp/data:/data typesense/typesense:29.0 --data-dir /data --api-key=Hu52dwsas2AdxdE
```
我们提供了几种语言的 [API 客户端](#api-clients),但在本例中让我们使用 Python 客户端。
安装 Typesense 的 Python 客户端:
```
pip install typesense
```
我们现在可以初始化客户端并创建一个 `companies` 集合:
```
import typesense
client = typesense.Client({
'api_key': 'Hu52dwsas2AdxdE',
'nodes': [{
'host': 'localhost',
'port': '8108',
'protocol': 'http'
}],
'connection_timeout_seconds': 2
})
create_response = client.collections.create({
"name": "companies",
"fields": [
{"name": "company_name", "type": "string" },
{"name": "num_employees", "type": "int32" },
{"name": "country", "type": "string", "facet": True }
],
"default_sorting_field": "num_employees"
})
```
现在,让我们向我们刚刚创建的集合添加一个文档:
```
document = {
"id": "124",
"company_name": "Stark Industries",
"num_employees": 5215,
"country": "USA"
}
client.collections['companies'].documents.create(document)
```
最后,让我们搜索刚刚索引的文档:
```
search_parameters = {
'q' : 'stork',
'query_by' : 'company_name',
'filter_by' : 'num_employees:>100',
'sort_by' : 'num_employees:desc'
}
client.collections['companies'].documents.search(search_parameters)
```
**您注意到查询文本中的拼写错误了吗?** 没关系。Typesense 开箱即用地处理排版错误!
## 分步演练
我们的网站上提供了分步演练,请访问 [这里](https://typesense.org/guide)。
这将指导您完成启动 Typesense 服务器、在其中索引数据以及查询数据集的过程。
## API 文档
这是我们的官方 API 文档,可在我们的网站上找到:[https://typesense.org/api](https://typesense.org/api)。
如果您发现文档或演练有任何问题,请告诉我们或在此处向我们发送 PR:[https://github.com/typesense/typesense-website](https://github.com/typesense/typesense-website)。
## API 客户端
虽然您绝对可以使用 CURL 直接与 Typesense Server 交互,但我们提供官方 API 客户端以简化从您选择的语言使用 Typesense 的过程。API 客户端内置了智能重试策略,以确保通过它们进行的 API 调用具有弹性,特别是在 HA 设置中。
- [JavaScript](https://github.com/typesense/typesense-js)
- [PHP](https://github.com/typesense/typesense-php)
- [Python](https://github.com/typesense/typesense-python)
- [Ruby](https://github.com/typesense/typesense-ruby)
如果我们没有提供您语言的 API 客户端,您仍然可以使用任何流行的 HTTP 客户端库直接访问 Typesense 的 API。
以下是一些社区贡献的客户端和集成:
- [Go](https://github.com/typesense/typesense-go)
- [.Net](https://github.com/DAXGRID/typesense-dotnet)
- [Java](https://github.com/typesense/typesense-java)
- [Rust](https://github.com/typesense/typesense-rust)
- [Dart](https://github.com/typesense/typesense-dart)
- [Perl](https://github.com/Ovid/Search-Typesense)
- [Swift](https://github.com/typesense/typesense-swift)
- [Clojure](https://github.com/runeanielsen/typesense-clj)
- [python orm client](https://github.com/RedSnail/typesense_orm)
- [PHP SEAL Adapter](https://github.com/schranz-search/seal-typesense-adapter)
- [Elixir](https://github.com/jaeyson/ex_typesense)
我们欢迎社区贡献来添加更多的官方客户端库和集成。请通过 contact@typsense.org 联系我们或在 GitHub 上开启 issue 与我们协作架构。🙏
### 框架集成
我们还有以下框架集成:
- [Laravel](https://github.com/typesense/laravel-scout-typesense-engine)
- [Firebase](https://github.com/typesense/firestore-typesense-search)
- [Gatsby](https://www.gatsbyjs.com/plugins/gatsby-plugin-typesense/)
- [WordPress](https://wordpress.org/plugins/search-with-typesense/?ref=typesense)
- [WooCommerce](https://www.codemanas.com/downloads/typesense-search-for-woocommerce/?ref=typesense)
- [Symfony](https://github.com/acseo/TypesenseBundle)
- [InstantSearch](https://github.com/typesense/typesense-instantsearch-adapter)
- [DocSearch](https://typesense.org/docs/guide/docsearch.html)
- [Docusaurus](https://github.com/typesense/docusaurus-theme-search-typesense)
- [ToolJet](https://tooljet.com/?ref=typesense)
- [Plone CMS](https://pypi.org/project/zopyx.typesense/)
- [Craft CMS](https://plugins.craftcms.com/typesense)
- [SEAL](https://github.com/schranz-search/schranz-search) 提供了 Typesense 在 Laravel、Symfony、Spiral、Yii 和 Laminas Mezzio PHP 框架中的集成
### Postman Collection
我们在这里有一个社区维护的 Postman Collection:[https://github.com/typesense/postman](https://github.com/typesense/postman)。
[Postman](https://www.postman.com/downloads/) 是一款应用程序,让您可以通过点击来执行 HTTP 请求,而不必在终端中输入它们。
上面的 Postman Collection 为您提供了可以导入 Postman 的模板请求,以便快速向 Typesense 发出 API 调用。
## 搜索 UI 组件
您可以使用我们的 [InstantSearch.js 适配器](https://github.com/typesense/typesense-instantsearch-adapter) 快速构建强大的搜索体验,包括过滤、排序、分页等。
操作指南:[https://typesense.org/docs/guide/search-ui-components.html](https://typesense.org/docs/guide/search-ui-components.html)
## 常见问题
### 这与 Elasticsearch 有何不同?
Elasticsearch 是一个庞大的软件,需要花费大量的精力来设置、管理、扩展和微调。
它为您提供数千个配置参数以获得理想的配置。因此它更适合大型团队,
他们有足够的资源使其投入生产,定期监控并扩展它,特别是当他们需要存储数十亿份文档和 PB 级数据时(例如:日志)。
Typesense 专为缩短令人愉悦的搜索体验的“上市时间”而构建。它是一个轻量但强大且可扩展的替代方案,专注于开发者的快乐和体验,具有清晰文档完善的 API、清晰的语义和智能的默认值,因此它开箱即用,无需您拨动许多旋钮。
Elasticsearch 也运行在 JVM 上,这本身就需要花费相当大的精力来调整以实现最佳运行。另一方面,
Typesense 是一个单一的轻量级独立原生二进制文件,因此设置和操作都很简单。
查看此处的功能对比 [这里](https://typesense.org/typesense-vs-algolia-vs-elasticsearch-vs-meilisearch/)。
### 这与 Algolia 有何不同?
Algolia 是一款专有的、托管的搜索即服务产品,如果不考虑成本,它的效果很好。根据我们的经验,
快速增长的网站和应用程序很快就会遇到搜索和索引限制,随着规模扩大伴随着昂贵的计划升级。
另一方面,Typesense 是一个开源产品,您可以在自己的基础设施上运行
或使用我们的托管 SaaS 产品 - [Typesense Cloud](https://cloud.typesense.org)。
开源版本免费使用(当然除了您自己的基础设施成本)。
对于 Typesense Cloud,我们不按记录或搜索操作收费。相反,您将获得一个专用集群
您可以向其投入尽可能多的数据和流量,只要它能处理。您只需支付固定的小时成本和带宽费用,
具体取决于您选择的配置,类似于大多数现代云平台。
从产品的角度来看,Typesense 在精神上比 Elasticsearch 更接近 Algolia。
但是,我们解决了 Algolia 的一些重要限制:
Algolia 为每种排序顺序需要单独的索引,这计入您的计划限制。大多数索引设置,如
要搜索的字段、要分面的字段、要分组的字段、排名设置等
在创建索引时预先定义,而不是能够在查询时即时设置。
使用 Typesense,这些设置可以通过查询参数在搜索时配置,这使其非常灵活
并解锁了新的用例。Typesense 还能够通过单个索引为您提供排序结果,而不必创建多个。
这有助于减少内存消耗。
Algolia 提供 Typesense 目前尚未提供的以下功能:个性化和基于服务器的搜索分析。对于分析,您仍然可以在客户端检测您的搜索,并将搜索指标发送到您选择的 Web 分析工具。
我们打算在 Typesense 中弥补这一差距,但同时请告知我们
如果其中任何一个对您的用例来说是决定性的障碍,请在我们的 issue 追踪器中创建功能请求。
查看此处的功能对比 [这里](https://typesense.org/typesense-vs-algolia-vs-elasticsearch-vs-meilisearch/)。
### 速度很棒,但内存占用情况如何?
全新的 Typesense 服务器将消耗大约 30 MB 的内存。当您开始索引文档时,内存使用量将
相应增加。增加多少取决于您索引的字段数量和类型。
我们努力保持内存中的数据结构精简。给您一个粗略的概念:当 100 万个
Hacker News 标题连同其点数被索引时,Typesense 消耗 165 MB 的内存。该数据在磁盘上 JSON 格式的相同大小为 88 MB。如果您有来自自己数据集的任何数字可以添加到本节,请给我们发送 PR!
### 为什么选择 GPL 许可证?
根据我们的经验,当公司使用的 **库** 是 GPL 许可的时,他们通常会担心,因为库代码直接集成到他们的代码中,会导致衍生作品并触发 GPL 合规性。然而,Typesense Server 是 **服务器软件**,我们期望用户通常将其作为单独的 daemon 运行,而不是将其与自己的代码集成。GPL 慷慨地涵盖并允许这种用例 **(例如:Linux 是 GPL 许可的)**。现在,AGPL 使得通过网络访问的服务器软件产生衍生作品,而不是 GPL。因此我们选择不对 Typesense 使用 AGPL。
现在,如果有人修改 Typesense server,GPL 实际上允许您仍然保留修改给自己,只要您不分发修改后的代码。因此,例如,一家公司可以修改 Typesense server 并在内部运行修改后的代码,并且仍然不必开源其修改,只要他们将修改后的代码提供给所有有权访问修改后软件的人。
现在,如果有人修改 Typesense server 并分发修改,这就是 GPL 发挥作用的地方。既然我们已经将我们的工作发布给社区,我们希望其他人的修改也能本着开源的精神向社区公开。**我们为此目的使用 GPL。** 其他许可证将允许我们的开源工作被修改、变成闭源并分发,而我们希望通过对 Typesense 这样做来避免这种情况,以利于项目的长期可持续性。
这里有更多关于为什么是 GPL 的背景,正如 Discourse 所描述的:https://meta.discourse.org/t/why-gnu-license/2531。那里提到的许多观点与我们产生了共鸣。
现在,以上所有仅适用于 Typesense Server。我们的客户端库确实旨在集成到我们用户的代码中,因此它们使用 Apache 许可证。
总之,AGPL 通常是服务器软件的问题所在,我们选择不使用它。我们相信 Typesense Server 的 GPL 捕捉了我们对此开源项目的期望。GPL 有着被流行开源项目成功使用的悠久历史。我们的库仍然是 Apache 许可的。
如果您有具体问题因许可问题阻止您使用 Typesense,我们很乐意与您进一步探讨。请联系我们。
## 支持
👋 🌐 如果您对 Typesense 有一般性问题,想打个招呼或只是想关注,我们邀请您加入我们的公开 [Slack 社区](https://typesense.link/slack-community)。
如果您遇到任何问题或疑问,请创建一个 GitHub issue,我们会尽力提供帮助。
我们努力通过我们在 GitHub 上的 issue 追踪器提供良好的支持。但是,如果您希望获得私密和优先的支持,包括:
- 保证的 SLA
- 电话 / 视频通话,讨论您的具体用例并获得最佳实践建议
- Slack 上的私密讨论
- 有关扩展最佳实践的指导
- 优先功能请求
我们提供 [此处](https://typesense.org/support/) 描述的付费支持选项。
## 贡献
我们是一个精简的团队,致力于实现搜索的民主化,我们将接受所有能获得的帮助!如果您想参与,这里是关于我们需要您帮助的信息:[Contributing.md](https://github.com/typesense/typesense/blob/master/CONTRIBUTING.md)
## 获取最新更新
如果您希望在我们发布新版本时获得更新,请点击顶部的“Watch”按钮并选择“Releases only”。GitHub 将在每次新版本发布时向您发送通知以及更新日志。
我们还会向我们的 Twitter 帐户发布有关版本更新和与 Typesense 相关的其他主题。在这里关注我们:[@typesense](https://twitter.com/typesense)。
👋 🌐 我们还会在我们的 [Slack 社区](https://typesense.link/slack-community) 发布更新。
## 从源码构建
我们使用 [Bazel](https://bazel.build) 来构建 Typesense。
Typesense 需要以下依赖项:
* C++11 兼容编译器 (GCC >= 4.9.0, Apple Clang >= 8.0, Clang >= 3.9.0)
* Snappy
* zlib
* OpenSSL (>=1.0.2)
* curl
* ICU
有关最新的依赖项集,请参阅 [CI build 步骤](.github/workflows/tests.yml)。
安装它们后,从 repo 的根目录运行以下命令:
```
bazel build //:typesense-server
```
首次构建将花费一些时间,因为作为构建过程的一部分,会拉取并构建其他第三方库。
© 2016至今 Typesense Inc.
标签:Algolia 替代品, API, C++, Docker, ElasticSearch 替代品, NoSQL 数据库, Pinecone 替代品, SaaS, Typesense, 全文检索, 内存数据库, 后端开发, 向量搜索, 威胁情报, 安全防御评估, 实时搜索, 幻觉缓解, 开发者工具, 拼写纠错, 搜索引擎, 数据库, 数据擦除, 数据索引, 模糊匹配, 模糊搜索, 站点搜索, 语义搜索, 请求拦截