907

0

Typesense

Algolia 的开源替代品和 ElasticSearch 的更易于使用的替代品⚡ 🔍 ✨快速、容错、内存模糊的搜索引擎,用于构建令人愉悦的搜索体验

类型感

Typesense 是一个快速、容错的搜索引擎,用于构建令人愉悦的搜索体验。

一个开源的 Algolia 替代方案和 一个更易于使用的 ElasticSearch 替代方案

网站| 文档| 路线图| 社区| 推特| 工作时间

Typesense 演示

✨以下是几个 现场演示 ,展示了 Typesense 在大型数据集上的实际应用:

快速链接

特征

  • Typo Tolerance: 优雅地处理印刷错误,开箱即用。
  • 简单而令人愉快: 易于设置、集成、操作和扩展。
  • ⚡极速: 内置 C++。为低延迟(<50ms)即时搜索而精心设计。
  • 可调排名: 轻松定制您的搜索结果以达到完美。
  • 排序: 在查询时根据特定字段对结果进行排序(有助于“按价格排序(asc)”等功能)。
  • 分面和过滤: 向下钻取并优化结果。
  • 分组和不同: 将相似的结果分组在一起以显示更多种类。
  • 联合搜索: 在单个 HTTP 请求中搜索多个集合(索引)。
  • 地理搜索: 按地理位置周围的结果进行搜索和排序。
  • Scoped API Keys: 为多租户应用程序生成仅允许访问某些记录的 API 密钥。
  • 同义词: 将单词定义为彼此的等价词,因此搜索单词也会返回定义的同义词的结果。
  • 策展和商品化: 将特定记录提升到搜索结果中的固定位置,以展示它们。
  • Raft-based Clustering: 设置一个高可用的分布式集群。
  • 无缝版本升级: 随着新版本 Typesense 的出现,升级就像换出二进制文件并重新启动 Typesense 一样简单。
  • 无运行时依赖项: Typesense 是一个单一的二进制文件,您可以使用单个命令在本地或生产环境中运行它。

在此列表中没有看到功能? 如果有人已经请求它,请搜索我们的问题跟踪器,并在其中添加评论以解释您的用例,或者如果没有,则打开一个新问题。我们会根据用户反馈确定路线图的优先级,因此我们很乐意听取您的意见。

路线图

这是 Typesense 的公共路线图:https ://github.com/typesense/typesense/projects/2 。

第一列还解释了我们如何确定功能的优先级、您如何影响优先级以及我们的发布节奏。

基准

  • 包含 220 万份食谱 (食谱名称和成分)的数据集:
    • 在 Typesense 中进行索引时占用了大约 900MB 的 RAM
    • 花了 3.6 分钟索引所有 220 万条记录
    • 在具有 4 个 vCPU 的服务器上,Typesense 每秒能够处理 104 个并发搜索查询 ,平均搜索处理时间为11 毫秒
  • 包含 2800 万本书 (书名、作者和类别)的数据集:
    • 在 Typesense 中建立索引时占用了大约 14GB 的 RAM
    • 花费 78 分钟索引所有 2800 万条记录
    • 在具有 4 个 vCPU 的服务器上,Typesense 每秒能够处理 46 个并发搜索查询 ,平均搜索处理时间为28 毫秒
  • 凭借包含 300 万个产品 (亚马逊产品数据)的数据集,Typesense 能够在 8-vCPU 3 节点高可用性 Typesense 集群上处理每秒 250 个并发搜索查询的吞吐量。

如果我们可以在公共领域找到大型数据集,我们很乐意使用更大的数据集进行基准测试。如果您对开放的结构化数据集有任何建议,请通过打开问题告诉我们。如果您能够从自己的大型数据集中共享基准,我们也会很高兴。请向我们发送 PR!

谁在用这个?

Typesense 被不同行业的一系列用户使用。我们最近才开始在Showcase中记录谁在使用它。

如果您想被列入列表,请随时编辑SHOWCASE.md并向我们发送 PR。

您还将在Typesense Cloud主页上看到用户徽标列表。

安装

选项 1: 您可以下载我们为 Linux (x86-64) 和 Mac 发布的二进制包

选项 2: 您也可以从我们的官方 Docker 镜像运行 Typesense 。

选项 3:使用Typesense Cloud启动托管集群:

使用 Typesense Cloud 进行部署

快速开始

这是一个快速示例,展示了如何创建集合、索引文档并在 Typesense 上搜索它。

让我们从通过 Docker 启动 Typesense 服务器开始:

docker run -p 8108:8108 -v/tmp/data:/data typesense/typesense:0.23.1 --data-dir /data --api-key=Hu52dwsas2AdxdE

我们有几种语言的API 客户端,但让我们在这个例子中使用 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 开箱即用地处理印刷错误!

逐步演练

在我们的网站上提供了分步演练。

这将指导您完成启动 Typesense 服务器、在其中索引数据和查询数据集的过程。

API 文档

这是我们的官方 API 文档,可在我们的网站上找到:https://typesense.org/api

如果您发现文档或演练有任何问题,请让我们知道或在此处向我们发送 PR:https://github.com/typesense/typesense-website

API 客户端

虽然您绝对可以使用 CURL 直接与 Typesense 服务器交互,但我们提供官方 API 客户端来简化您选择的语言中的 Typesense 使用。API 客户端内置了智能重试策略,以确保通过它们进行的 API 调用具有弹性,尤其是在 HA 设置中。

如果我们不提供您的语言的 API 客户端,您仍然可以使用任何流行的 HTTP 客户端库直接访问 Typesense 的 API。

以下是一些社区贡献的客户端和集成:

我们欢迎社区贡献以添加更多官方客户端库和集成。请通过contact@typsense.org与我们联系,或在 Github 上打开一个问题,与我们就架构进行合作。🙏

搜索 UI 组件

您可以使用我们的InstantSearch.js 适配器 快速构建强大的搜索体验,包括过滤、排序、分页等。

方法如下:https ://typesense.org/docs/0.23.1/guide/#search-ui

常问问题

这与 Elasticsearch 有何不同?

Elasticsearch 是一个大型软件,它需要付出不小的努力来设置、管理、扩展和微调。它为您提供了数千个配置参数,以达到您的理想配置。因此,它更适合有足够带宽将其投入生产、定期监控和扩展的大型团队,尤其是当他们需要存储数十亿文档和 PB 数据(例如:日志)时。

Typesense 专为缩短“上市时间”而构建,以提供令人愉悦的搜索体验。它是一种轻量级但功能强大且可扩展的替代方案,专注于开发人员的幸福感和体验,具有清晰的文档齐全的 API、清晰的语义和智能默认设置,因此它开箱即用,无需您转动许多旋钮.

Elasticsearch 也可以在 JVM 上运行,这本身就需要相当大的努力来调整以优化运行。另一方面,Typesense 是一个轻量级的自包含本机二进制文件,因此设置和操作都很简单。

在此处查看并排功能比较。

这与Algolia 有何不同?

Algolia 是一种专有的、托管的、搜索即服务的产品,在成本不是问题的情况下运行良好。根据我们的经验,快速增长的网站和应用程序很快就会遇到搜索和索引限制,并伴随着随着规模的扩大而进行昂贵的计划升级。

另一方面,Typesense 是一种开源产品,您可以在自己的基础架构上运行或使用我们的托管 SaaS 产品 - Typesense Cloud。开源版本可以免费使用(当然除了您自己的基础设施费用)。使用 Typesense Cloud,我们不按记录或搜索操作收费。相反,您将获得一个专用集群,并且可以向其投放尽可能多的数据和流量。您只需支付固定的小时成本和带宽费用,具体取决于您选择的配置,类似于大多数现代云平台。

从产品的角度来看,Typesense 在精神上比 Elasticsearch 更接近 Algolia。但是,我们已经解决了 Algolia 的一些重要限制:

Algolia 需要为每个排序顺序使用单独的索引,这将计入您的计划限制。大多数索引设置,如要搜索的字段、要分面的字段、要分组的字段、排名设置等,都是在创建索引时预先定义的,而不是能够在查询时动态设置它们。

使用 Typesense,可以在搜索时通过查询参数配置这些设置,这使得它非常灵活并解锁了新的用例。Typesense 还能够为您提供具有单个索引的排序结果,而不必创建多个。这有助于减少内存消耗。

Algolia 提供了 Typesense 当前不具备的以下功能:个性化和基于服务器的搜索分析。对于分析,您仍然可以在客户端检测您的搜索并将搜索指标发送到您选择的网络分析工具。

我们打算在 Typesense 中弥合这一差距,但与此同时,请通过在我们的问题跟踪器中创建功能请求,让我们知道这些中的任何一个是否适合您的用例。

在此处查看并排功能比较。

速度很棒,但是内存占用呢?

一个新的 Typesense 服务器将消耗大约 30 MB 的内存。当您开始索引文档时,内存使用会相应增加。它增加多少取决于您索引的字段的数量和类型。

我们努力保持内存数据结构的精简。给你一个粗略的想法:当 100 万个 Hacker News 标题连同它们的分数一起被索引时,Typesense 会消耗 165 MB 的内存。磁盘上 JSON 格式的相同数据大小为 88 MB。如果您有任何来自您自己的数据集中的数字可以添加到本节中,请向我们发送 PR!

为什么是 GPL 许可证?

根据我们的经验,公司通常会担心他们使用的是否获得 GPL 许可,因为库代码直接集成到他们的代码中,会导致衍生工作并触发 GPL 合规性。但是,Typesense Server 是 服务器软件 ,我们希望用户通常将其作为单独的守护进程运行,而不是将其与自己的代码集成。GPL 慷慨地涵盖并允许这个用例 (例如:Linux 是 GPL 许可的) 。现在,AGPL 使通过网络访问的服务器软件产生衍生作品而不是 GPL。出于这个原因,我们选择不对 Typesense 使用 AGPL。

现在,如果有人对 Typesense 服务器进行了修改,GPL 实际上允许您将修改保留给自己,只要您不分发修改后的代码。因此,公司可以例如修改 Typesense 服务器并在内部运行修改后的代码,而仍然不必开源他们的修改,只要他们将修改后的代码提供给有权访问修改后的软件的每个人。

现在,如果有人对 Typesense 服务器进行修改并分发修改,这就是 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 社区

我们还每周五进行虚拟办公时间。在这里预留一个时间段。

如果您遇到任何问题或问题,请创建一个 Github 问题,我们将尽力提供帮助。

我们努力通过 Github 上的问题跟踪器提供良好的支持。但是,如果您想通过以下方式获得私人和优先支持:

  • 保证的 SLA
  • 电话/视频电话讨论您的特定用例并获得有关最佳实践的建议
  • 关于 Slack 的私人讨论
  • 关于部署、运营和扩展最佳实践的指南
  • 优先功能请求

我们确实提供付费支持选项。请通过contact@typesense.org与我们联系以进行注册。

贡献

我们是一支精干的团队,肩负着使搜索民主化的使命,我们将尽我们所能获得的帮助!如果您想参与其中,以下是有关我们可以在哪里使用您的帮助的信息:Contributing.md

获取最新更新

如果您想在我们发布新版本时获得更新,请单击顶部的“观看”按钮并选择“仅发布”。然后 Github 会在每个新版本中向您发送通知以及更改日志。

我们还会在我们的 Twitter 帐户上发布与 Typesense 相关的版本和其他主题的更新。在此处关注我们:@typesense

👋 🌐新内容:我们还将在Slack 社区上发布更新。

从源代码构建

使用 Docker 构建

docker build 脚本负责所有必需的依赖项,因此它是构建 Typesense 的最简单方法:

TYPESENSE_VERSION=nightly ./docker-build.sh --build-deploy-image --create-binary [--clean] [--depclean]

在您的机器上构建

Typesense 需要以下依赖项:

  • C++11 兼容编译器(GCC >= 4.9.0,Apple Clang >= 8.0,Clang >= 3.9.0)
  • Snappy
  • zlib
  • OpenSSL (>=1.0.2)
  • curl
  • ICU
  • brpc
  • braft
./build.sh --create-binary [--clean] [--depclean]

第一次构建需要一些时间,因为其他第三方库是作为构建过程的一部分被拉取和构建的。


© 2016 年至今 Typesense Inc.