OVIRO LogoOVIRO
Quản lý sản phẩm (PIM)Sản phẩm

Tìm kiếm sản phẩm

API tìm kiếm sản phẩm nâng cao với bộ lọc, phân trang và aggregation (Facets).

Endpoint

POST /site/products/search

Headers

KeyValueBắt buộcMô tả
SiteTenantId{tenant_id}ID của công ty/tenant.
SiteAuthorization{jwt_token}KhôngToken khách hàng (nếu có) để áp dụng chính sách giá riêng.

Workflow & Logic

API này hoạt động theo mô hình Search-First, truy xuất dữ liệu từ ElasticSearch (thông qua ProductIndexer) để đảm bảo hiệu năng cao khi lọc và thống kê (aggregation). Sau khi có danh sách ID từ ES, hệ thống sẽ Enrich (làm giàu) dữ liệu từ Database để đảm bảo tính chính xác nhất về giá, tồn kho và các thông tin chi tiết.

Quy trình xử lý (Internal Processing)

  1. Khởi tạo (Initialization):

    • Xác định company_id hiện tại.
    • Tải cấu hình hệ thống (Setting), quan trọng nhất là website_price_policy_id để xác định chính sách giá áp dụng cho người dùng (Khách vãng lai/Đại lý/VIP).
  2. Xử lý Bộ lọc (Filter Processing):

    • Visibility:
      • Mặc định chỉ lấy sản phẩm có trạng thái VISIBILITY_SHOWVISIBILITY_CATALOG_ONLY.
      • Nếu có từ khóa keyword, bổ sung thêm VISIBILITY_SEARCH_ONLY.
      • with_attachment=1: Cho phép hiển thị sản phẩm quà tặng/phụ kiện (VISIBILITY_ATTACHMENT).
    • Price Range: Phân tích chuỗi price (VD: 0-100000.200000-500000) thành các khoảng giá để query ES.
    • Product Options: Giải mã chuỗi productoption (VD: optionID:valID1,valID2) để lọc theo thuộc tính động.
    • String Facet: Lọc theo các thuộc tính dạng chuỗi (dynamic attribute) gửi qua request body.
  3. Truy vấn Search Engine (ES Query):

    • Thực hiện query tới ElasticSearch với các tiêu chí lọc.
    • Tính toán Aggregations (Facets) theo yêu cầu từ tham số aggs (VD: đếm số lượng theo Brand, Category).
  4. Làm giàu dữ liệu (Data Enrichment):

    • Từ danh sách ID trả về bởi ES, gọi enrichDataForListing -> getProductCard:
      • Variants & Pricing: Tính toán giá thực tế dựa trên Policy (Giá chính sách > Giá UOM > Giá gốc).
      • Selectable Options: Tính toán ma trận tùy chọn (Màu/Size) khả dụng dựa trên các Variants thực tế. Giúp Frontend ẩn các nút không có hàng.
      • Social Videos: Tự động parse link (TikTok/Youtube) thành ID video nhúng.

Parameters

TênKiểuBắt buộcMô tả
keywordstringTừ khóa tìm kiếm.
category_idintegerLọc theo ID danh mục chính xác.
category_id_liststringLọc theo danh sách ID danh mục (cách nhau dấu phẩy).
brandstringLọc theo danh sách ID thương hiệu (cách nhau dấu phẩy, ID đã mã hóa hoặc raw ID).
pricestringLọc theo khoảng giá. VD: 0-100000 hoặc 0-100000.200000-500000 (nhiều khoảng).
productoptionstringLọc theo thuộc tính. Format: optionID:valueID,valueID|optionID2:valueID.
string_facetobjectLọc theo thuộc tính động dạng chuỗi (string facet). Gửi qua request body.
id_liststringLọc theo danh sách ID sản phẩm cụ thể (cách nhau dấu phẩy).
aggsstringDanh sách aggregation cần lấy. VD: agg_brand,agg_category. Có thể chỉ định size: agg_brand:10.
sorterintegerMã sắp xếp (1: Giá tăng, 2: Giá giảm, ...).
pageintegerTrang hiện tại. Mặc định là 1.
limitintegerSố kết quả mỗi trang. Mặc định là 20.
with_attachmentinteger1: Bao gồm sản phẩm đính kèm; 0: Ẩn (Mặc định).

Response Schema

HTTP 200 - JSON Object

{
  "total": 100,
  "currentpage": 1,
  "limit": 20,
  "items": [
    {
      "id": 10,
      "name": "Iphone 15 Pro Max",
      "type": 1,
      "status": 3,
      "seo_url": "iphone-15-pro-max",
      "brand_id": 5,
      "badge": "Mới",
      "category": {
        "id": 1,
        "name": "Điện thoại",
        "seo_url": "dien-thoai",
        "parent_id": 0
      },
      "selectable_options": [],
      "variants": [],
      "thumbnails": [],
      "gallery": [],
      "social_videos": [],
      "product_uoms": [],
      "info_promotion_note": "Giảm 10%",
      "avg_rating": 4.5,
      "count_rating": 100,
      "default_variant_id": 100,
      "weight_type": 0,
      "weight_sale_mode": 0,
      "pricing_type": 0,
      "procurement_type": 0,
      "allow_preorder": 0,
      "sell_on_zero": 0,
      "_score": 1.5
    }
  ],
  "aggs": [
    {
      "type": "agg_brand",
      "name": "agg_brand",
      "display_order": 1,
      "count_other": 0,
      "stats_bucket": 0,
      "buckets": [
        {
          "id": 50,
          "count": 10,
          "name": "Samsung",
          "more_info": "{\"seo_url\": \"...\"}"
        }
      ]
    }
  ]
}

Response Fields

TrườngKiểuMô tả
totalintegerTổng số kết quả tìm được
currentpageintegerTrang hiện tại
limitintegerSố kết quả mỗi trang
itemsarrayDanh sách sản phẩm. Xem Product Object (chỉ bao gồm các trường Listing)
aggsarrayDanh sách Aggregation (Facets). Xem Aggregation Schema

Aggregation Schema

Mỗi item trong aggs chứa kết quả thống kê cho một loại aggregation.

TrườngKiểuMô tả
typestringLoại aggregation (agg_brand, agg_category, agg_string_facet, agg_product_option)
namestringTên aggregation. Với agg_string_facetagg_product_option, đây là tên thuộc tính (VD: "Chất liệu")
display_orderintegerThứ tự hiển thị
count_otherintegerSố lượng kết quả nằm ngoài top N (overflow)
stats_bucketinteger/objectThông tin thống kê bucket (min/max cho khoảng giá...)
bucketsarrayDanh sách giá trị. Xem bảng Bucket bên dưới

Bucket Item

TrườngKiểuMô tả
idstring/integerID của giá trị (Category ID, Brand ID, hoặc tên thuộc tính)
countintegerSố lượng sản phẩm khớp
namestringTên hiển thị (tự enrich từ DB cho agg_categoryagg_brand)
more_infostringJSON chứa thông tin bổ sung (VD: seo_url cho category)

Aggregation Types

TypeMô tảEnrichment
agg_categoryThống kê theo danh mụcname = tên danh mục, more_info chứa seo_url
agg_brandThống kê theo thương hiệuname = tên thương hiệu
agg_string_facetThống kê theo thuộc tính động (chuỗi)name = giá trị thuộc tính
agg_product_optionThống kê theo product optionname = giá trị option

Các lỗi thường gặp (422)

Mã lỗiMô tả
error_jwt_hash_not_foundToken định danh (SiteAuthorization) không tìm thấy hoặc hết hạn.
Index error...Lỗi kết nối hoặc truy vấn tới bộ máy tìm kiếm ElasticSearch.

Xem Product Object Schema · Variant Object Schema

On this page