Skip to content

Search

@nx/search là một package dạng thư viện, không phải ứng dụng IGNIS độc lập. Nó cung cấp bốn IGNIS component để một host service (hiện là commerce) đăng ký, cùng với một SearchableControllerMixin mà consumer gắn vào các REST controller của riêng mình. Nó giữ ~8 Typesense collection đồng bộ với PostgreSQL qua một pipeline CDC Debezium → Kafka và phục vụ tìm kiếm theo từ khoá + ngữ nghĩa tuỳ chọn.

1. Tham chiếu nhanh

Thuộc tínhGiá trị
Package@nx/search
CodeLIB-SEARCH
LoạiThư viện / component package (dùng bởi commerce)
RuntimeBun (>=1.3.8) - chạy bên trong process host
Base ClassN/A - không có lớp Application; export các lớp con BaseComponent
Vị trípackages/search
Base Path/search (mount dưới base path của host service)
Dev PortN/A - package thư viện, không có port riêng
Container PortN/A - chạy trong container host (commerce)
Snowflake IDN/A - host service sở hữu cấp phát ID
Search EngineTypesense ^3.0.3 (nodes dạng protocol:host:port)
Nguồn đồng bộDebezium → Kafka CDC (schema public, pricing, inventory)
Được dùng bởicommerce
Binding Namespace@nx/search

Bản chất thư viện: không có application.ts, index.ts → bootstrapApplication(), port riêng, hay DB schema riêng. Ứng dụng host đăng ký bốn component theo thứ tự phụ thuộc; tất cả collection, service, CDC consumer, và SearchController chung được gắn vào IGNIS container của host. Xem ADR-0001.

2. Mục đích & Phạm vi

Bao gồmKhông bao gồm
Tìm kiếm full-text theo từ khoá trên 8 Typesense collectionSở hữu các bảng nguồn (commerce/pricing/inventory sở hữu chúng)
Tìm kiếm ngữ nghĩa / hybrid tuỳ chọn qua auto-embeddingVận hành model embedding (cấu hình Typesense/Google bên ngoài)
CDC consumer: đồng bộ Debezium → Kafka → TypesenseBản thân Debezium connector (do infra sở hữu)
Lan toả cascade từ bảng join/liên quan tới document chínhWrite API để thay đổi document trực tiếp từ client
Dịch where/order/fields/include kiểu Ignis → TypesenseToán tử khớp mẫu (like/ilike/regexp) - dùng text search
SearchableControllerMixin cho /search + /search/count theo từng entityPolicy về scope theo tenant (host ghi đè resolveSearchScope)
Phát hiện schema drift (migration thủ công khi sai lệch)Tự dựng lại collection đã sai lệch (làm thủ công, tránh mất dữ liệu)

3. Tech Stack

Bên ngoài:

Thư việnMục đích
@venizia/ignisIoC container, BaseComponent, BaseRestController, DI
@venizia/ignis-helpersLogger, applicationEnvironment, HTTP helpers
typesenseTypesense client - CRUD collection, search, import
@platformatic/kafkaCDC Kafka consumer + DLQ producer
avscGiải mã Avro cho payload CDC Debezium
@hono/zod-openapiSchema Zod request/response cho route search
zodKiểm tra schema
lodashTiện ích

Nội bộ:

PackageMục đích
@nx/coreCdcTables, ConfigurationRepository, EnvironmentKeys, SystemConfigurations, base class, DI

4. Cấu trúc Project

packages/search/
├── src/
│   ├── index.ts                    # Barrel - re-export components, services, helpers
│   ├── component.ts                # ApplicationSearchComponent
│   ├── components/
│   │   ├── embedding-configuration.component.ts
│   │   ├── typesense-search-engine.component.ts
│   │   └── cdc.component.ts
│   ├── common/                     # keys, environments, constants, kafka-topics,
│   │                               # search.types, relations, pipeline-config types
│   ├── configurations/             # 8 collection configs + schema-fragments.ts
│   ├── controllers/                # SearchController + searchable.mixin + definitions
│   ├── datasources/                # (re-export)
│   ├── helpers/                    # typesense, converter, registry, include, migration
│   ├── mappers/                    # DB row → Typesense doc (theo từng entity + *-info)
│   ├── services/
│   │   ├── search/                 # SearchService, SearchIndexingService
│   │   ├── cdc/                    # kafka, cdc, cascade, enrichment, circuit-breaker
│   │   └── search-configuration.service.ts
│   ├── migrations/processes/       # backfill processes
│   └── utilities/                  # error-classifier, with-retry, errors
├── scripts/                        # migrate, rebuild-collection, backfill-search
└── package.json

Khôngapplication.ts / migrate.ts / models/ / repositories riêng - đây là thư viện, không phải service.

5. Architecture

@nx/search chạy bên trong host service (commerce). Sơ đồ thể hiện nó được nhúng.

Chi tiết: xem Architecture.

6. Snapshot Domain

Không có schema PostgreSQL riêng - "domain" là tập các Typesense collection, mỗi collection là một projection phi chuẩn hoá của các bảng nguồn.

Schema collection đầy đủ + nguồn cascade: xem Domain Model.

7. Tổng quan bề mặt

REST controller - @nx/search mở ra hai endpoint; phần lớn consumer dùng mixin thay vì controller chung. Schema đầy đủ được render trực tiếp từ /doc/openapi.json của host service (commerce), không phải từ thư viện này.

NguồnBase pathEndpoints
SearchController (chung)/search/{collectionName}2 (GET, GET …/count)
SearchableControllerMixin (theo từng entity, trên controller của consumer)<entity>/search2 mỗi controller
PermissionAction
search:searchTìm kiếm document
search:search-countĐếm số document khớp

Async topics (tham chiếu đầy đủ trong API Events):

HướngSố lượng
Inbound (Kafka CDC)18 topic trên 3 schema
Outbound (Kafka)1 - DLQ (nx.seller.cdc.dlq)
WebSocket out0
BullMQ jobs in/out0

8. Components

Đăng ký bởi host theo thứ tự này:

Thứ tựComponentFileMục đích
1ApplicationSearchComponentsrc/component.tsĐọc Typesense nodes + 8 collection config từ env, bind SEARCH_COMPONENT_OPTIONS, đăng ký ConfigurationRepository + SearchConfigurationService
2ApplicationEmbeddingConfigurationComponentsrc/components/embedding-configuration.component.tsNạp config model embedding tuỳ chọn + config pipeline từ DB; bind EMBEDDING_MODEL_CONFIG + SEARCH_PIPELINE_CONFIG
3TypesenseSearchEngineComponentsrc/components/typesense-search-engine.component.tsTạo TypesenseHelper, đăng ký collection vào CollectionRegistry (gắn embed.from), đăng ký service + SearchController, chạy kiểm tra schema-drift
4ApplicationCdcComponentsrc/components/cdc.component.tsKhởi động CDCKafkaService trên ALL_CDC_TOPICS, kèm DLQ + circuit breaker tuỳ chọn

9. Services

ServiceFileMô tả ngắn
SearchServicesrc/services/search/search.service.tsPhía truy vấn: filter Ignis → Typesense, phân giải include, trả về { count, data }
SearchIndexingServicesrc/services/search/search-indexing.service.tsPhía ghi: upsert/xoá đơn lẻ + theo batch, chỉ số throughput, getHealth()
CDCServicesrc/services/cdc/cdc.service.tshandleBatch() - định tuyến các dòng CDC tới mapper, upsert/xoá
CDCCascadeServicesrc/services/cdc/cdc-cascade.service.tsLan toả thay đổi của bảng join/liên quan để tính lại document chính
CDCEnrichmentServicesrc/services/cdc/cdc-enrichment.service.tsBổ sung dữ liệu xuyên collection vào document
CDCCircuitBreakerServicesrc/services/cdc/cdc-circuit-breaker.service.tsThăm dò sức khoẻ Typesense, tạm dừng tiêu thụ khi sự cố (tuỳ chọn bật)
CDCKafkaServicesrc/services/cdc/cdc-kafka.service.tsKafka consumer, gom batch, định tuyến DLQ
SearchConfigurationServicesrc/services/search-configuration.service.tsĐọc config embedding + pipeline từ bảng Configuration

10. Repositories

RepositoryBảngNguồnMethod tuỳ chỉnh
ConfigurationRepositorycore.Configuration@nx/core- (đăng ký, không sở hữu; đọc config embedding/pipeline)

Search không sở hữu bảng nào; nó không có repository riêng.

11. Entry Points

FileMục đích
src/index.tsBarrel export - host import component từ đây
src/component.tsApplicationSearchComponent (component đầu vào)
scripts/migrate.tsMigration schema chỉ-thêm - diff config với Typesense đang chạy, PATCH trường (migrate[:apply])
scripts/rebuild-collection.tsDựng lại collection kiểu blue-green với đổi alias nguyên tử (migrate:rebuild[:apply])
scripts/backfill-search.tsBackfill các dòng DB sẵn có bằng incremental snapshot của Debezium (backfill[:apply])

Không có bootstrapApplication() / bootstrapMigration() - những cái đó thuộc về host service.

12. Configuration

Typesense nodes/API key, env CDC + circuit breaker, config embedding + pipeline lưu trong DB: xem Configuration.

13. Operations

Chạy bên trong commerce - không triển khai độc lập. Migration schema, độ trễ CDC, chẩn đoán đồng bộ: xem Operations.

14. Trang liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.