通过实际操作产品验证交付内容,记录用户可查看的证据,并发布验收报告。可检查已有验证计划或创建检查项,选择合适的操作界面,并使用 `lh` CLI 发布结果。
- 实际检查更改后的产品行为
- 收集截图或其他验证证据
- 编写验证计划和报告
此技能指导你调整产品数据的全文检索,涵盖 PostgreSQL 与 Elasticsearch 检索路径、权限校验、文档映射、增量同步和重新索引;不涉及智能体的外部网页搜索。
Use for product search: FtsSearchRepo, pg_search/pg_like/Elasticsearch, mapping migrations, projections, Outbox sync, reindexing and performance. Excludes agent web search.
实测评分 未实测
查看安装方法此技能用于指导产品数据全文检索的设计和实现,数据包括智能体、消息、文件和知识库。它涵盖通过仓库接口处理搜索请求、划分 PostgreSQL 与 Elasticsearch 服务提供方的职责、维护搜索文档映射和投影,以及在结果中保留数据库权限检查。添加可搜索的数据类型时,还需要检查相关类型、文档结构、搜索逻辑、变更捕获、重新索引和持续同步。内容也涉及通过 Outbox 同步变更、迁移检查点、版本管理、监控和测试。
添加产品数据作为搜索对象、切换搜索服务提供方或调整映射时,可以参考此技能。它也适用于规划从 PostgreSQL 迁移至 Elasticsearch 或重建索引,以及在改造搜索功能时维持结果权限和同步行为。
此技能针对产品内数据搜索,不包括智能体使用的外部网页搜索。可用的搜索服务提供方包括 pg_search、elasticsearch 和 pg_like。操作 Elasticsearch 需要相应配置和运行环境;原文以能够访问相关开发仓库、数据库及搜索服务为前提。
本介绍由 AI(OpenAI Codex)根据公开的 SKILL.md 撰写。准确的规格请查看下方原文。
AI 根据 SKILL.md 的内容检查了需要注意的操作和使用前提。评分只依据实际运行的结果(实测对比)。
不计入评分。 由 AI(OpenAI Codex)于 2026年10月26日 评估。仅供参考,安装前请同时查看原文。
安装前可以查看交给 AI 代理的指令内容。
This skill covers search over LobeHub-owned product data such as agents, topics, messages, files,
knowledge bases, documents, chat groups, and memories. It does not cover the agent's external web
search providers under apps/server/src/services/search/ or builtin web-browsing tools.
Product reads follow one stable path:
router/service -> createFtsSearchRepo -> FtsSearchRepo -> selected backend -> existing result schema
apps/server/src/services/ftsSearch/ owns request-scoped provider selection, Elasticsearch
configuration, its HTTP client, and backend telemetry. Routers and domain services must call
createFtsSearchRepo; they must not construct providers themselves.packages/database/src/repositories/ftsSearch/ owns the provider-neutral contract and the concrete
PostgreSQL and Elasticsearch implementations. Keep public result shapes stable in FtsSearchRepo.packages/types/src/ftsSearch.ts owns the shared searchable-entity list and search domain types.packages/database/src/repositories/ftsSearchDocument/ owns Elasticsearch document schemas,
mappings, queryable fields, and source-to-document projection.packages/database/src/schemas/ftsSearchSyncOutbox.ts and
packages/database/src/repositories/ftsSearchSyncOutbox/ own durable change capture, claims,
retries, dead letters, leases, revision fences, and capture-definition validation.scripts/elasticsearchReindex/ owns the resumable full-backfill command and its operational
runtime. Shared database source queries and document construction remain in
packages/database/src/repositories/ftsSearchDocument/. apps/server/src/services/ftsSearchSync/ and
scripts/elasticsearchSync/ own continuous incremental draining.packages/env/src/ftsSearch.ts owns generic Elasticsearch environment variables.FTS_SEARCH_PROVIDER is a deployment-level provider selector with current values pg_search,
elasticsearch, and pg_like. It is not a feature flag or a user rollout. Add another enum value
only when its provider covers all entities in FTS_SEARCH_BACKEND_ENTITIES end to end, including
mode: 'candidates' when the provider enables ftsSearchCandidateEnabled.pg_like is an explicitly selected lightweight
provider, not an implicit fallback: a missing extension or unreachable service must still fail.packages/database/src/repositories/ftsSearch/postgres/ owns the query, permission, pagination,
and hydration layer shared by PostgreSQL providers. pgSearch/ and pgLike/ own only their
provider adapter, dialect, and provider-specific candidate behavior. Neither provider directory
may import the other, so either provider can be retired without owning shared functionality.userId, workspaceId, and caller-agent visibility throughout every provider. Candidate
retrieval must not broaden the caller's scope.pg_like primarily serves individual users with small datasets. Review it for correct matching,
permissions, and usable result ordering at that scale. For richer search quality or larger datasets,
recommend self-hosted Elasticsearch or Elastic Cloud. Do not add indexes or change the database
schema as part of pg_like optimization. Keep repairs bounded; distinguish new implementation bugs
from shared provider limitations and deliberate lightweight-search trade-offs. Do not infer a
personal-user performance problem from large shared development datasets without representative
measurements.
Treat an entity addition or projection change as one cross-layer change. Inspect and update every applicable item:
FTS_SEARCH_DOCUMENT_ENTITIES and shared request/result types.FtsSearchDocumentBuilder, including soft deletion and fanout from related source rows.captureInfrastructure.ts.Schema fields, mappings, builders, and fixed fixtures must agree. Current mapping fields plus
explicit FTS_SEARCH_RETAINED_SOURCE_PROPERTIES must equal the current Zod fields, without overlap.
Retained source properties keep older open indexes writable during field removals; keep the builder
producing them until those indexes are closed. They must not appear in current query metadata.
A field outside the document schema must not appear in a mapping or query field list.
Elasticsearch multi_match query length is bounded by a shared leaf-clause budget divided by the
selected query-field count. Adding a field reduces that entity's safe query length, and changing a
query analyzer to emit multiple terms per Unicode code point requires revisiting the budget and its
field-count regression tests.
installCaptureInfrastructure() is transactional, definition-checked,
idempotent for an exact installation, and fail-closed for partial or altered definitions.(entity, document_id). A newer capture resets retry/dead-letter state and
allocates a new revision only after locking the conflicting row, preserving same-document commit
order.last_value alone as proof that all earlier Outbox rows are visible.The supported operator entrypoints below run from the OSS repository root. A wrapping repository
may expose different package scripts; check its package.json before invoking these or the mapping
migration commands linked below.
bun run db:install-fts-search-capture
bun run fts-search:reindex -- --status
bun run fts-search:reindex -- --apply --yes
bun run fts-search:sync -- --max-steps=8 --yes
bun run scripts/pgSearchCleanup/index.ts --status
bun run scripts/pgSearchCleanup/index.ts --apply --yes
Docker startup runs fts-search-elasticsearch-reindex.cjs --startup --yes after PostgreSQL
migrations when the selected provider is Elasticsearch. It blocks serving until index migration
and catch-up succeed. Persist the same checkpoint volume across application and migration
containers; failed namespace locks still require explicit recovery. Continuous sync remains a
separate worker. Hosted and manual workflows keep their explicit migration commands.
For mapping changes, generation operations, repeat/resume behavior, or deployment integration, read Mapping migration workflow. It routes to the public command guide and adds recovery, automation, and local Docker rehearsal rules.
resource_already_exists_exception, not a broad HTTP status range. Preserve any other creation
failure and stop before follow-up reads or mutations instead of turning a rejected request into a
misleading verification error.Elasticsearch cannot change an existing field's type or index-time analyzer in place. The code declares the target and Elasticsearch records the live state, per entity:
FTS_SEARCH_INDEX_DEFINITIONS[entity].schemaVersion is the declared generation; the fingerprint is
sha256 of the mapping plus the shared analysis. Add complete changed-entity definitions in a new
ftsSearchDocument/migration/NNNN-meaningful-name/ batch, register it and update current pointers
in migration/index.ts. Append expected fingerprints in __tests__/schemaSnapshots.json; preserve
published batches and baselines. mappings.test.ts and migration/index.test.ts check current
parity, history, version bumps and fingerprint changes. See migration/README.md for ownership.
Shared analysis changes alter
every entity fingerprint and classify as breaking for every entity; bump all affected versions
and rebuild rather than using in-place upgrades.<alias>-v<n> or same-schema rebuild <alias>-v<n>-r<runId> carries
_meta.{reindex_run_id, schema_version, schema_fingerprint}; the alias marks the live generation.
A rebuild suffix is physical identity, not a schema-version bump. Indexes created before fingerprints
existed may omit the fingerprint, but still need a valid run ID and schema version for sync
readiness. _meta.schema_version wins over the -v<n> suffix because an in-place upgrade advances
_meta without renaming the index.<alias>-v* indexes plus the alias write index, pruning each
document to the fields that index maps (every generation is dynamic: strict), so a new
generation can be backfilled beside the live one; a bulk work item is acknowledged only when
every existing generation accepted it (2xx or 409 conflict).(namespace, schemaVersion). Explicit current-version
rebuild checkpoints add reindexRunId, so repeated v1 rebuilds never reuse a completed v1 cursor.
--apply groups the requested entities by declared version, treats existing aliases as an
upgrade (no --fresh-run), leaves existing aliases in place, and emits promotion_pending. A
completed first install creates aliases. Promoting a newer generation requires a completed
checkpoint, a fingerprint match when targeting the declared version, and an idle target-entity Outbox. Rollback
to an older stamped generation can use its metadata without a retained checkpoint;
--retire requires in_sync and only closes old generations; explicit --purge installs
exact-index templates forbidding auto-creation before deleting eligible closed generations.
--in-place requires
mappingChange: additive, widens the live index with PUT _mapping, pins the checkpoint to that
index, and backfills with external_gte so concurrent sync writes win.--apply --rebuild-current --entity=<entity> --yes when projection or capture semantics changed
without a physical mapping change and historical documents must be regenerated from PostgreSQL.
Deploy runtime support first: sync must recognize -r<runId> generations before one is created.
Resume with the reported --run-id=<uuid>. Promote with the exact
--generation=<alias>-v<n>-r<uuid> because version-only selection is ambiguous. The old generation
remains dual-written for rollback and becomes same-version retirement-eligible only after the
promotion records which live run superseded it.ES_REINDEX_STATE_DIR across
invocations. Completed runs skip backfill; incomplete runs resume from saved cursors. Mutating CLI
commands share a non-expiring Elasticsearch namespace lock, independent of checkpoint location.
A failed command retains its lock when its outcome may be uncertain. Before --release-lock=<owner> --yes, stop the previous process and resolve pending requests; never assume age proves it stopped.
The lock does not serialize old binaries or external operator actions.scripts/elasticsearchReindex/runtime/generationService.ts owns classification (missing,
unmanaged, in_sync, drift, upgrade_available, rollback_required), promotion, and
retirement; keep them free of Cloud-specific policy.Read docs/self-hosting/advanced/neon-pg-search-migration.mdx or its Chinese counterpart before
changing the operational sequence. When database rollout or index cost affects the design, also
use the db-migrations skill and measure the relevant operation on the actual Dev database before
adding manual or deferred release steps.
apps/server/src/services/ftsSearch/observability.ts.
Keep labels bounded: entity, provider, operation, outcome, and coarse error type are acceptable;
raw queries, user IDs, document IDs, and index contents are not.src/features/CommandMenu/analytics.ts. Product analytics may cover end-to-end duration, rendered
result counts, empty results, result clicks, and abandonment without a Cloud business slot.FtsSearchRepo, providers cannot leak raw result shapes,
and telemetry failures do not affect search behavior.bun run check <changed-files...> from the repository root. For migration or database-runtime
changes, follow the db-migrations and testing skills and verify against the actual Dev database.还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
通过实际操作产品验证交付内容,记录用户可查看的证据,并发布验收报告。可检查已有验证计划或创建检查项,选择合适的操作界面,并使用 `lh` CLI 发布结果。
本技能指导在 LobeHub 中接入 AI 模型提供商,涵盖运行时、模型信息、设置、品牌展示、文档和验收,并帮助判断新增模型是否需要新的提供商集成。
本技能指导如何用服务器端环境变量设置用户偏好默认值,涵盖变量校验、服务器配置、写入用户状态,以及更新 `.env.example` 和自托管文档。
说明如何在智能体执行步骤、工具调用、人工审批、上下文压缩和子智能体调用时注册钩子。钩子可观察事件、模拟本地工具结果,也可通过 Webhook 按配置策略允许或拒绝工具调用。
此技能用于为智能体设计事件驱动的后台工作流,划分来源、信号、动作和策略的职责,并处理异步交接、去重、执行范围、完成记录与运行观测。
本技能在 macOS 桌面聊天应用中测试机器人频道:打开应用、进入频道或联系人、发送消息、等待回复并截图。支持 Discord、Slack、Telegram、微信、飞书和 QQ;iMessage 使用 BlueBubbles 桥接。