同一份索引可在库、自托管服务器与 SeekStorm 云之间自由迁移。
免费自托管,或者交给我们来运行。
为百万乃至数十亿级文档提供实时全文与向量搜索,在任何规模下都能保持亚毫秒级延迟——两行代码即可发出首次查询。
全文 + 向量,一次查询搞定。
快速自动纠错。
文档一经索引即可被搜索到。
多字段排序、并列打破与权重提升。
值分面与范围分面。
拉丁文、西里尔文、中日韩文、阿拉伯文。
将任意网站转换为干净、结构化、可搜索的 JSON——每秒处理数千个页面,自动剔除样板内容并提取结构化数据。
礼貌爬取,多线程。
支持 schema.org、Open Graph。
可自定义,保持结果新鲜。
SeekStorm 原生结合全文(BM25)与向量搜索——无需同步独立数据库,也无需拼凑重排序管线。
全文 + 向量,一次查询,一个索引。
几分钟内即可将 SeekStorm 接入 Claude、Cursor 或任何兼容 MCP 的智能体。
文档在被索引的同一毫秒即可被搜索到。
同一份二进制索引始终伴随着你——从嵌入式库,到自托管服务器,再到全托管云服务。
嵌入你的应用,无需运行服务器。
REST API,运行在你自己的基础设施上。
我们负责运行,你无需操心。
慢查询不只是更慢——它意味着转化流失和收入损失。即便平均速度很快,只要在第 99 百分位出现延迟峰值,依然可能让你失去这笔订单。
为什么尾部延迟会让你失去客户 →因为「瞬时」是一个人类感知层面的概念,而不是工程目标。
平均延迟还不够。搜索基础设施需要为数千个并发查询、复杂查询和流量高峰预留余量。
实时系统、高频应用和 AI 智能体可以机器的速度发出请求——往往是大量并行请求。
当搜索只是更大应用或智能体工作流中的一个环节时,每一毫秒都会累加。
没有垃圾回收暂停,无需调优 JVM,第 99 百分位也不会出现意外延迟峰值。
架构专为随索引增长而并行执行查询而设计。
内建于核心架构,而非作为独立分词步骤附加。
SymSpell、PruningRadixTrie,以及比 Block-Max-WAND 更快的 top-k 联合算法。
全文 + 向量,一次查询,一个索引。
MCP 服务器、实时索引——搜索能力跟得上你的智能体。
库 ↔ 服务器 ↔ 云——每一步都是同一份二进制索引,无厂商锁定。
Algolia、Elasticsearch 和 Turbopuffer 的宽松替代方案。
永久免费自托管。
底层是同一套 REST API,上层则是符合各语言习惯的封装。选择适合你技术栈的客户端。
pip install seekstorm-client-pure-py
from seekstorm_client import SeekStorm, CreateIndexRequest, SearchRequestObject
client = SeekStorm(
base_url="http://127.0.0.1:80",
apikey_base64="YOUR_APIKEY_BASE64"
)
schema = [
{"field": "title", "field_type": "Text", "store": True, "index_lexical": True},
]
create_request = CreateIndexRequest(
index_name="demo_index",
schema=schema,
similarity="Bm25f",
tokenizer="UnicodeAlphanumeric",
stemmer="None",
document_compression="Snappy",
ngram_indexing=0,
)
index_id = client.create_index(create_request).index_id
client.index_document(index_id, {"title": "rust search"})
client.commit_index(index_id)
query = SearchRequestObject(query_string="rust search", offset=0, length=10)
result = client.query_index(index_id, query)
print(f"total hits: {result.count_total}")
client.close()
npm install seekstorm_client_ts
import { FieldType, SeekStormClient } from "seekstorm_client_ts";
const client = new SeekStormClient({
baseUrl: "http://127.0.0.1:80",
apiKey: "YOUR_APIKEY_BASE64",
});
const indexId = await client.createIndex({
index_name: "demo_index",
schema: [{field: "title", field_type: FieldType.Text, store: true, index_lexical: true}]
});
await client.indexDocument(indexId, { title: "rust search" });
await client.commitIndex(indexId);
const result = await client.search(indexId, { query: "rust search", length: 10 });
console.log(`total hits: ${result.count_total}`);
cargo add seekstorm_client_rs tokio serde_json
use seekstorm_client_rs::{RestClient, CreateIndexRequest, Document, SearchRequestObject};
use std::sync::LazyLock;
use std::error::Error;
pub static BASE_URL: &str = "http://127.0.0.1:80";
pub static API_KEY: &str = "YOUR_APIKEY_BASE64";
pub static CLIENT: LazyLock = LazyLock::new(|| RestClient::new());
#[tokio::main]
async fn main() -> Result<(), Box> {
let schema = serde_json::from_str(
r#"[{"field":"title","field_type":"Text","store":true,"index_lexical":true}]"#,
)?;
let create_index_request = CreateIndexRequest {
index_name: "demo_index".into(),
schema,
..Default::default()
};
let index_id = CLIENT
.create_index(BASE_URL, API_KEY, &create_index_request)
.await?
.index_id;
let document: Document = serde_json::from_str(r#"{"title":"rust search"}"#)?;
CLIENT.index_document(BASE_URL, API_KEY, index_id, &document).await?;
CLIENT.commit_index(BASE_URL, API_KEY, index_id).await?;
let search_request = SearchRequestObject {
query_string: "rust search".into(),
length: 10,
..Default::default()
};
let result = CLIENT.query_index(BASE_URL, API_KEY, index_id, search_request).await?;
println!("total hits: {}", result.count_total);
Ok(())
}
dotnet add package SeekStorm.Client
using SeekStorm.Client;
var client = new SeekStormClient(
baseUrl: "http://localhost:80",
apiKeyBase64: "YOUR_APIKEY_BASE64"
);
var createIndex = await client.CreateIndexAsync(new CreateIndexRequest
{
IndexName = "demo_index",
Schema = new List>
{
new()
{
["field"] = "title",
["field_type"] = "Text",
["store"] = true,
["index_lexical"] = true
}
}
});
await client.IndexDocumentAsync(createIndex.IndexId, new Dictionary
{
["title"] = "rust search"
});
await client.CommitIndexAsync(createIndex.IndexId);
var result = await client.QueryIndexAsync(createIndex.IndexId, new SearchRequestObject
{
QueryString = "rust search",
Length = 10
});
Console.WriteLine($"Total hits: {result.CountTotal}");
implementation 'com.seekstorm:seekstorm-client:1.0'
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.seekstorm.client.SeekStormClient;
import com.seekstorm.client.model.SearchRequest;
import com.seekstorm.client.model.SearchResponse;
ObjectMapper mapper = new ObjectMapper();
SeekStormClient client = SeekStormClient.builder()
.baseUrl("http://127.0.0.1:80")
.apiKey("YOUR_APIKEY_BASE64")
.build();
JsonNode createIndexRequest = mapper.createObjectNode()
.put("index_name", "demo")
.set("schema", mapper.createArrayNode()
.add(mapper.createObjectNode()
.put("field", "title")
.put("field_type", "Text")
.put("store", true)
.put("index_lexical", true)));
long indexId = client.createIndex(createIndexRequest);
JsonNode document = mapper.createObjectNode()
.put("title", "rust search");
client.indexDocument(String.valueOf(indexId), document);
client.commitIndex(String.valueOf(indexId));
SearchRequest request = SearchRequest.builder("rust search")
.length(10)
.build();
SearchResponse result = client.search(String.valueOf(indexId), request);
System.out.println("Total hits: " + result.countTotal());
go get github.com/seekstorm/seekstorm-go
import "github.com/seekstorm/seekstorm-go"
client := seekstorm.NewClient("http://localhost:80")
result := client.Search("my_index", "rust search")
SeekStorm 提供与 InstantSearch 兼容的适配器,这意味着你可以让现有前端直接指向 SeekStorm,几乎无需修改其他任何东西——你也可以用它搭配 Algolia 的 InstantSearch 组件库,以 SeekStorm 的 REST API 为后端来构建全新界面。
按实际使用付费,并按资源类型拆分——让你清楚看到账单具体来自哪里,而不是一个笼统的数字。
部署前预估费用,实时监控用量,设置月度消费上限,杜绝意外账单。
|
月度承诺金额
$20
|
0% 折扣 |
|
文档数
1M
|
$0.00 |
|
每月文档更新数
100K
|
$0.00 |
|
每月查询数
100K
|
$0.00 |
|
每次查询平均结果数
10
|
$0.00 |
| 已包含 | |
| $0.00 | |
| $0.00 | |
| $0.00 | |
| 预估月度费用 | $0.00 |
这是预估费用——因为你输入的负载数据本身就是估算值。总额并非简单相加:各用量行已计入你的承诺折扣,总额取折扣后用量费用与承诺金额中的较大者,再加上任何附加项。
达到上限后,SeekStorm 会自动限制用量,而不是继续产生费用。
SeekStorm 是 Algolia、Elasticsearch 和 Turbopuffer 的宽松开源替代方案。你可以免费自行运行核心引擎,也可以让我们在 SeekStorm 云上为你托管。
开源身份实际带来的改变——这不是完整的功能对比,只是许可证直接决定的部分。
| SeekStorm | Elasticsearch | Algolia | Turbopuffer | |
|---|---|---|---|---|
| 开源 | ✓ 宽松许可(Apache 2.0) | ✓ 非宽松许可(AGPL) | ✕ | ✕ |
| 自托管 | ✓ 永久免费 | ✓ | ✕ | ✕ |
| 索引可迁移性 | ✓ 库 ↔ 服务器 ↔ 云 | ✕ | ✕ | ✕ |
在努力为客户打造最佳搜索体验的同时,我们同样致力于为开源社区做出贡献。