@ findlane/ 服务器
Findlane服务器SDK:上传并更新目录,管理索引设置,并进行搜索,带有密件工作空间API密钥. 它随处可见 fetch does: Node.js 18+, Bun, Deno, 以及边缘运行时间。 永远不要将其或密钥捆绑到浏览器代码; 使用 @findlane/browser 在这里.
文档 : https://findlane.dev/docs/server-sdk 页面存档备份,存于互联网档案馆
安装
npm install @findlane/server
快开始
import { SearchServerClient } from "@findlane/server"
const client = new SearchServerClient({
workspaceId: process.env.FINDLANE_WORKSPACE_ID!,
apiKey: process.env.FINDLANE_API_KEY!,
})
const products = client.index("products")
await products.upsert([{ objectID: "sku-1", title: "Trail shoe", brand: { name: "Acme" }, price: 12900 }])
const results = await products.search({ q: "trail shoe", limit: 10 })
console.log(results.total, results.hits[0]?.record.title)
工作空间ID位于仪表板设置下,密钥位于API密钥下. 密钥有一个或两个范围:
search数字 :search()。 。 。 .write:记录写作,设置,公开搜索限制,以及索引状态.
寻找访客
当你的服务器搜索某个人时,比如装入服务器的搜索页时,通过访问者. 索引的限制和机器人规则然后适用于它们,就像它们适用于浏览器搜索一样,从Googlebot等经核实的爬行者那里搜索是免费的:
const results = await products.search({ q }, { visitor: { ip: req.ip, userAgent: req.get("user-agent") } })
suggest() 财务报告和审定财务报表 recommendations() 选择相同。 没有它,搜索算作你的服务器自己的.
索引的方法
client.index<T>(name) 返回这些; T 键入您需要字符串的记录 objectID。 。 。 .
| 方法 | 它会做什么 |
|---|---|
search(request, options?) | 以查询、过滤、侧面、排序、呼呼和突出显示来搜索. explain: true 说为什么每次命中和命令一致 appliedRules 列出索引中的查询规则. options 带 signal 财务报告和审定财务报表 visitor (下关. |
querySuggestions({ q, limit? }), (中文(简体) ), popularSearches({ limit? }) | 作为访客的搜索, [{ q, typed }],索引的流行搜索一个空框。 不计为搜索 . |
upsert(records) | 增加或更新最多1 000个记录 objectID。 。 。 . |
replaceAll(records) | 在一个请求中替换整个目录(最多10万个记录). |
replaceAllStaged(records, options) | 在一个阶段 ID 中替换一个 批次较大的目录, 在一个阶段 中切换 。 重试中相同的 stageId 简历. abortReplacement(stageId) 丢出一个舞台. |
delete(objectID) | 删除记录. |
getRecord(objectID) | 记录及其版本. |
upsertOne(record, { expectedVersion }), (中文(简体) ), deleteOne(objectID, { expectedVersion }) | 只有记录还在时才写 expectedVersion (0对一个从未存在过的人来说);用一等分量键重审. |
getSettings(), (中文(简体) ), replaceSettings(settings), (中文(简体) ), waitForSettings() | 读取和更改可搜索字段,方块,过滤器,类型,自定义排序,同义词,语言,字典容忍度,和文本正常化. |
compareSettings(settings, { queries, searched }?) | 比较索引本身的设置而不保存它们:它的搜索测试和大多数被搜索的查询,每个都同时搜索. 说哪项测试会失败,谁的结果会改变. |
getSearchTests(), (中文(简体) ), setSearchTests(tests) | 搜索必须持续工作,除设置外保存,如前3或至少100个结果的记录. compareSettings 检查他们. |
getIndexingStatus(), (中文(简体) ), waitUntilIndexed(revision) | 写入一个已接受的修改, 并在被接受时可以搜索, 所以 waitUntilIndexed 立即返回. |
getPublicSearchAccess(), (中文(简体) ), setPublicSearchPolicy(policy), (中文(简体) ), usePublicIndexDefaults() | 限制浏览器可能读取和查询的内容 . |
events.send(events, { visitorId, visitId, abTest }?), (中文(简体) ), events.importOrders(orders), (中文(简体) ), events.cancelOrder(orderID) | 索引“事件”页面和“购买”的顺序和其他事件;关键需要 events 或者说 write 范围。 你自己的匿名访客身份证明 将一个蠢货的事件联系起来 当索引带走他们时. abTest从Shopper的搜索答案, 把它们放在他们的A/B测试组. |
abTests.get(), (中文(简体) ), abTests.estimate({ share }), (中文(简体) ), analytics.abTest() | 该指数的A/B测试它的设置, 及其结果, 以及测试会是什么。 主人在仪表板上开始和结束它们. |
events.forget(ids) | 在一周内删除与这些访客或访问身份证一起发送的事件. |
events.proxy(request), (中文(简体) ), events.relay(body, visitor) | 浏览器 SDK 事件的路径( 它) eventsUrl),是广告阻塞者让通过. 见 活动。 。 。 . |
analytics.searches(), (中文(简体) ), .queries({ list, limit }), (中文(简体) ), .filters(), (中文(简体) ), .events(), (中文(简体) ), .products(), (中文(简体) ), .productCounts(), (中文(简体) ), .product(objectID) | 索引是分析的,对于你自己的管理者:随时间推移而搜索,用点击来进行最高查询,没有结果或点击的查询,使用的过滤器,事件,以及每个产品的观点,加到目录和命令. 关键是 analytics 范围,并且只在服务器上工作。 见 分析。 。 。 . |
writes.get({ range }), (中文(简体) ), writes.log({ problems, before, limit }) | 索引中的内容:当数据最后到达和最后改变任何东西时,按来源分列,写作拒绝的理由。 关键是 analytics 范围,并且只在服务器上工作。 见 更新。 。 。 . |
设置
replaceSettings 发送完整的设置; 首先获取以保留其他字段。 内容 applied 说变化是如何产生的:
instant:查询时间设置,并删除或重排可搜索字段.fields:平面,过滤器,排序,和排序字段,已填入.searchable: 新建可搜索字段,填入.rebuild:文本正常化;索引重建.
一个大 searchable 或者说 rebuild 背景变化仍在继续,其进展包括: rebuild (也由 getSettings) (中文(简体) ). 搜索使用以前的设置直到完成,以及 waitForSettings() 等待着.
在保存更改规则,同义词, 字形容忍,或排名之前, compareSettings 显示它的作用,和 {} 以当前设置运行搜索测试 :
const comparison = await products.compareSettings({ rules: nextRules })
const failing = comparison.tests.filter((test) => test.before && !test.after)
if (!failing.length) await products.replaceSettings({ ...(await products.getSettings()), rules: nextRules })
浏览器搜索
仅当浏览器搜索被启用时, 您打算公开的上传字段 . getPublicSearchAccess() 显示当前模式. setPublicSearchPolicy({ returnFields, searchFields, filterFields, facetFields, sortIds, defaultSort }) 限制 API 的索引,并且 usePublicIndexDefaults() 取消限制。 只有工作空间所有者才能更改允许浏览器的出处,在仪表板中.
已签名密钥
对于已登录的人的浏览器搜索,从仪表板的API密钥页面中用签名密钥在短命密钥上签名. 它不提出要求,它的限制取代了索引的公开设置:
import { signSearchKey } from "@findlane/server"
const signedKey = await signSearchKey(process.env.FINDLANE_SIGNING_KEY!, {
validUntil: new Date(Date.now() + 60 * 60 * 1000),
indexes: ["products"],
filters: { customerGroup: user.group },
userToken: user.id,
})
浏览器 SDK 将其视为 signedKey。见 登录访问者。 。 。 .
错误
请求抛出失败 FindlaneError 与 HTTP 连接 status 和API的信息。 402指计划限制,如记录或每月搜索. replaceAllStaged 丢出一个 StagedReplacementError 与 stageId 重试。 每一种方法都有选择 AbortSignal。 。 。 .
许可证
麻省理工学院