跳转到内容

Typesense — 高性能搜索引擎

是什么

Typesense 是 Typesense Inc.(印度+美国团队)2019 年开源的自托管搜索引擎,用 C++ 写,主打”开发者友好 + 类似 Algolia 的开箱体验”。

日常类比:

  • Algolia 像付费 SaaS(按搜索量收费的”搜索盒子”),开箱即用但贵
  • Typesense 是它的自托管开源版——同样的 typo-tolerant + instant-search UI 体验,但跑在你自己机器上免费

它和 elasticsearch 解决的问题类似(全文搜索),但定位不同:Elasticsearch 是”重武器、什么都能干、什么都得自己配”;Typesense 是”小而美、默认配置就够好、API 极简”。

为什么重要

下面这些场景让 Typesense 在 2020 年后快速崛起:

  • Algolia 平替:相同 instant-search 体验(输边搜边出结果),Algolia 大流量下账单几千美元一月,Typesense 自托管基本零成本
  • typo-tolerance 默认开:用户输 “iphne” 也能搜到 “iPhone”——这是搜索体验最重要的一道”善意默认”
  • Schema-based 设计:必须先声明字段(与 MeiliSearch “无 schema” 不同),换来更可控的查询语义和更稳的索引行为
  • 50ms 内响应:内存全量索引 + C++ 实现,单节点轻松做到 P99 < 50ms
  • 内置向量搜索(v0.24+):一份数据库同时跑 BM25 关键词检索 + 向量语义检索,混合排序——做 RAG 应用不用再上 Pinecone / Milvus

核心要点

抓三个概念就够:

Schema 必须先声明

不像 MeiliSearch / Elasticsearch 的动态 mapping(自动推断字段类型),Typesense 强制你在 create_collection 时把字段都写清楚:

{
"name": "books",
"fields": [
{ "name": "title", "type": "string" },
{ "name": "authors", "type": "string[]", "facet": true },
{ "name": "publication_year", "type": "int32" }
]
}

好处:查询行为可预测,不会因为某天插了一条脏数据让字段类型漂移。

代价:字段一旦声明改不了——加字段可以,改类型必须重建 collection(与 Elasticsearch mapping 同坑)。

RAFT 共识做多节点强一致

单节点跑没问题,要做 HA 就开 3 节点 RAFT 集群——Leader 写、Follower 读、心跳检测自动切主。比 Elasticsearch 的”主分片+副本分片”模型更简单,但要求 quorum 数(节点数的多数派)配对,配错就跑不起来。

向量搜索内置

声明 float[] 字段加 num_dim 就是向量字段:

{ "name": "embedding", "type": "float[]", "num_dim": 384 }

查询时混合用:q=笔记本&vector_query=embedding:([...], k:10),BM25 词频得分和向量余弦相似度按权重融合排序。

实践案例

案例 一:本地启一个单节点

Terminal window
docker run -p 8108:8108 \
-v /tmp/typesense-data:/data \
typesense/typesense:27.0 \
--data-dir /data --api-key=xyz

--api-key 是管理员密钥,所有 API 调用都带 X-TYPESENSE-API-KEY 头。本地玩具用 xyz 这种弱 key 没事,生产环境换强密钥。

案例 二:建 collection + 插数据 + 搜索

Terminal window
# 建 collection
curl -H "X-TYPESENSE-API-KEY: xyz" \
-X POST 'http://localhost:8108/collections' \
-d '{"name":"books","fields":[
{"name":"title","type":"string"},
{"name":"author","type":"string"}
]}'
# 插一条文档
curl -H "X-TYPESENSE-API-KEY: xyz" \
-X POST 'http://localhost:8108/collections/books/documents' \
-d '{"title":"Designing Data-Intensive Applications","author":"Martin Kleppmann"}'
# 搜
curl -H "X-TYPESENSE-API-KEY: xyz" \
'http://localhost:8108/collections/books/documents/search?q=desigining&query_by=title'

注意第三步搜索关键词故意拼错成 “desigining”——typo-tolerance 默认开 1-2 个字符容错,仍然能命中。这就是 Algolia 体验的复刻。

案例 三:前端 InstantSearch UI 一行嵌入

import instantsearch from 'instantsearch.js'
import TypesenseInstantSearchAdapter from 'typesense-instantsearch-adapter'
const adapter = new TypesenseInstantSearchAdapter({
server: { apiKey: 'search-only-key', nodes: [{ host: 'localhost', port: 8108, protocol: 'http' }] },
additionalSearchParameters: { query_by: 'title,author' },
})
instantsearch({ indexName: 'books', searchClient: adapter.searchClient })
.start()

复用 Algolia 生态的 instantsearch.js 一整套组件(搜索框 / 分面 / 高亮),只是底层换成 Typesense。前端零迁移成本。

踩过的坑

Schema 改字段类型必须重建 collection

title 声明成 string 后想改 string[]?不行。流程:新建 collection → reindex → 切别名(alias)。这点和 Elasticsearch mapping 一样,新人最容易踩。

内存全索引——大数据集要分布式

整个索引常驻内存(包括倒排表、向量、过滤位图)。单机 64G 内存大概只能放千万级文档。超出就要分 collection 拆分到多个节点,或者干脆上 Elasticsearch。这点和 MeiliSearch 一样。

HA 集群 quorum 数配错跑不起来

3 节点集群必须明确每个节点的 --peers 列表,少一个节点就达不到多数派、Leader 选不出来、整个集群假死。生产前务必拿 staging 跑一遍故障切换演练。

API 与 Elasticsearch 不兼容

不是”Elasticsearch 的精简版”——是另一套 REST API。从 Elasticsearch 迁过来要重写所有查询代码(DSL → Typesense 的 query string)。query_by 字段必须显式列出,不像 Elasticsearch 的 _all

scoped API key 容易漏配

前端用的搜索 key 必须用 scoped api key 派生(限定 collection / 限定 filter),不能直接把管理员 key 塞前端。漏配过这一步的项目很多——结果用户能用浏览器开发者工具拿到管理员 key 直接删库。

历史小故事

  • 2015 年:Jason Bosco(创始人)和 Kishore Nallan 在做电商项目时,被 Algolia 月费几千美元劝退,开始研究自建搜索引擎
  • 2019 年:第一个公开版本 v0.7 发布,开源 GPL-3.0
  • 2021 年:v0.20 增加 RAFT 共识,正式支持高可用集群
  • 2022 年:v0.24 加向量搜索,进入混合检索赛道
  • 2024 年:v27 GA,正式标记生产就绪;同期推出 Typesense Cloud(官方托管 SaaS)

学到什么

  • Schema-based 比 schemaless 更适合”长期跑”的搜索——一开始麻烦,但跑半年后字段类型不会漂
  • typo-tolerance + instant-search 不是 Algolia 专利:Typesense 和 MeiliSearch 把这套体验拉到了开源世界
  • 混合检索(BM25 + 向量)是 2024 年后搜索引擎的默认形态:纯关键词漏掉语义,纯向量漏掉精确匹配,必须融合
  • API 不兼容是一把双刃剑:Typesense 不模仿 Elasticsearch,所以设计能更干净,但迁移成本高

关联

  • elasticsearch —— 老牌分布式搜索引擎;功能更全但配置更重
  • redis —— 同样内存数据库;Redis 是 KV,Typesense 是搜索;常一起用做缓存+检索分层
  • postgresql —— 主存储常用关系库;CDC 同步到 Typesense 做搜索是常见架构
  • mongodb —— 文档库;和 Typesense 都是”以 JSON 文档为单位”思考

适用

适合

  • 需要快速搜索且要容错(typo-tolerance)的内容站、电商商品检索
  • 团队规模小,不想维护 Elasticsearch 集群

不适合

  • 数据量超过亿级、或需要复杂聚合分析(用 Elasticsearch / OpenSearch)

延伸阅读

反向链接

  • elasticsearch —— Elasticsearch — 分布式搜索引擎
  • meilisearch —— MeiliSearch — 开发者友好的搜索引擎
  • mongodb —— MongoDB — 文档型 NoSQL 数据库
  • postgresql —— PostgreSQL — 工业级关系数据库
  • redis —— Redis — 内存键值数据库