typesense/typesense

GitHub: typesense/typesense

一款用 C++ 构建的轻量级开源搜索引擎,集成了全文检索、向量搜索和 RAG 对话能力,主打低延迟和易用性,可作为 Algolia、Pinecone 和 Elasticsearch 的平替方案。

Stars: 25513 | Forks: 872

Typesense

Typesense is a fast, typo-tolerant search engine for building delightful search experiences.

开源的 Algolia 替代方案 &
更易用的 ElasticSearch 替代方案


Website | Documentation | Roadmap | Slack Community | Community Threads | Twitter


Typesense Demo

✨ 这里有一些展示了 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) 启动托管集群: Deploy with Typesense Cloud ## 快速开始 这是一个快速示例,展示了如何在 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, 全文检索, 内存数据库, 后端开发, 向量搜索, 威胁情报, 安全防御评估, 实时搜索, 幻觉缓解, 开发者工具, 拼写纠错, 搜索引擎, 数据库, 数据擦除, 数据索引, 模糊匹配, 模糊搜索, 站点搜索, 语义搜索, 请求拦截