diff --git a/.env b/.env
index f109c3f..78af395 100644
--- a/.env
+++ b/.env
@@ -31,3 +31,6 @@ IMAGE_MODEL_DIR=/data/tw/models/cn-clip
# Cache Directory
CACHE_DIR=.cache
+
+# Frontend API Base URL
+API_BASE_URL=http://120.76.41.98:6002
diff --git a/config/env_config.py b/config/env_config.py
index 52fdfc8..2e5bb45 100644
--- a/config/env_config.py
+++ b/config/env_config.py
@@ -37,6 +37,10 @@ CUSTOMER_ID = os.getenv('CUSTOMER_ID', 'customer1')
# API Service Configuration
API_HOST = os.getenv('API_HOST', '0.0.0.0')
API_PORT = int(os.getenv('API_PORT', 6002))
+# API_BASE_URL: 如果未设置,根据API_HOST构建(0.0.0.0使用localhost)
+API_BASE_URL = os.getenv('API_BASE_URL')
+if not API_BASE_URL:
+ API_BASE_URL = f'http://localhost:{API_PORT}' if API_HOST == '0.0.0.0' else f'http://{API_HOST}:{API_PORT}'
# Model Directories
TEXT_MODEL_DIR = os.getenv('TEXT_MODEL_DIR', '/data/tw/models/bge-m3')
diff --git a/config/schema/base/config.yaml b/config/schema/base/config.yaml
deleted file mode 100644
index 5fc3013..0000000
--- a/config/schema/base/config.yaml
+++ /dev/null
@@ -1,271 +0,0 @@
-# Base Configuration for Shoplazza
-# 店匠通用配置文件,所有使用店匠表的客户共用
-# 注意:此配置不包含MySQL相关配置,只包含ES搜索相关配置
-
-customer_name: "Shoplazza Base Configuration"
-
-# Elasticsearch Index
-es_index_name: "search_products"
-
-# ES Index Settings
-es_settings:
- number_of_shards: 1
- number_of_replicas: 0
- refresh_interval: "30s"
-
-# Field Definitions (SPU级别,只包含对搜索有帮助的字段)
-fields:
- # 租户隔离字段(必需)
- - name: "tenant_id"
- type: "KEYWORD"
- required: true
- index: true
- store: true
-
- # 商品标识字段
- - name: "product_id"
- type: "KEYWORD"
- required: true
- index: true
- store: true
-
- - name: "handle"
- type: "KEYWORD"
- index: true
- store: true
-
- # 文本搜索字段
- - name: "title"
- type: "TEXT"
- analyzer: "chinese_ecommerce"
- boost: 3.0
- index: true
- store: true
-
- - name: "brief"
- type: "TEXT"
- analyzer: "chinese_ecommerce"
- boost: 1.5
- index: true
- store: true
-
- - name: "description"
- type: "TEXT"
- analyzer: "chinese_ecommerce"
- boost: 1.0
- index: true
- store: true
-
- # SEO字段(提升相关性)
- - name: "seo_title"
- type: "TEXT"
- analyzer: "chinese_ecommerce"
- boost: 2.0
- index: true
- store: true
-
- - name: "seo_description"
- type: "TEXT"
- analyzer: "chinese_ecommerce"
- boost: 1.5
- index: true
- store: true
-
- - name: "seo_keywords"
- type: "TEXT"
- analyzer: "chinese_ecommerce"
- boost: 2.0
- index: true
- store: true
-
- # 分类和标签字段(TEXT + KEYWORD双重索引)
- - name: "vendor"
- type: "TEXT"
- analyzer: "chinese_ecommerce"
- boost: 1.5
- index: true
- store: true
-
- - name: "vendor_keyword"
- type: "KEYWORD"
- index: true
- store: false
-
- - name: "product_type"
- type: "TEXT"
- analyzer: "chinese_ecommerce"
- boost: 1.5
- index: true
- store: true
-
- - name: "product_type_keyword"
- type: "KEYWORD"
- index: true
- store: false
-
- - name: "tags"
- type: "TEXT"
- analyzer: "chinese_ecommerce"
- boost: 1.0
- index: true
- store: true
-
- - name: "tags_keyword"
- type: "KEYWORD"
- index: true
- store: false
-
- - name: "category"
- type: "TEXT"
- analyzer: "chinese_ecommerce"
- boost: 1.5
- index: true
- store: true
-
- - name: "category_keyword"
- type: "KEYWORD"
- index: true
- store: false
-
- # 价格字段(扁平化)
- - name: "min_price"
- type: "FLOAT"
- index: true
- store: true
-
- - name: "max_price"
- type: "FLOAT"
- index: true
- store: true
-
- - name: "compare_at_price"
- type: "FLOAT"
- index: true
- store: true
-
- # 图片字段(用于显示,不参与搜索)
- - name: "image_url"
- type: "KEYWORD"
- index: false
- store: true
-
- # 嵌套variants字段
- - name: "variants"
- type: "JSON"
- nested: true
- nested_properties:
- variant_id:
- type: "keyword"
- index: true
- store: true
- title:
- type: "text"
- analyzer: "chinese_ecommerce"
- index: true
- store: true
- price:
- type: "float"
- index: true
- store: true
- compare_at_price:
- type: "float"
- index: true
- store: true
- sku:
- type: "keyword"
- index: true
- store: true
- stock:
- type: "long"
- index: true
- store: true
- options:
- type: "object"
- enabled: true
-
-# Index Structure (Query Domains)
-indexes:
- - name: "default"
- label: "默认索引"
- fields:
- - "title"
- - "brief"
- - "description"
- - "seo_title"
- - "seo_description"
- - "seo_keywords"
- - "vendor"
- - "product_type"
- - "tags"
- - "category"
- analyzer: "chinese_ecommerce"
- boost: 1.0
-
- - name: "title"
- label: "标题索引"
- fields:
- - "title"
- - "seo_title"
- analyzer: "chinese_ecommerce"
- boost: 2.0
-
- - name: "vendor"
- label: "品牌索引"
- fields:
- - "vendor"
- analyzer: "chinese_ecommerce"
- boost: 1.5
-
- - name: "category"
- label: "类目索引"
- fields:
- - "category"
- analyzer: "chinese_ecommerce"
- boost: 1.5
-
- - name: "tags"
- label: "标签索引"
- fields:
- - "tags"
- - "seo_keywords"
- analyzer: "chinese_ecommerce"
- boost: 1.0
-
-# Query Configuration
-query_config:
- supported_languages:
- - "zh"
- - "en"
- default_language: "zh"
- enable_translation: true
- enable_text_embedding: true
- enable_query_rewrite: true
-
- # Translation API (DeepL)
- translation_service: "deepl"
- translation_api_key: null # Set via environment variable
-
-# Ranking Configuration
-ranking:
- expression: "bm25() + 0.2*text_embedding_relevance()"
- description: "BM25 text relevance combined with semantic embedding similarity"
-
-# Function Score配置(ES层打分规则)
-function_score:
- score_mode: "sum"
- boost_mode: "multiply"
-
- functions: []
-
-# Rerank配置(本地重排,当前禁用)
-rerank:
- enabled: false
- expression: ""
- description: "Local reranking (disabled, use ES function_score instead)"
-
-# SPU配置(已启用,使用嵌套variants)
-spu_config:
- enabled: true
- spu_field: "product_id"
- inner_hits_size: 10
-
diff --git a/config/schema/customer1/config.yaml b/config/schema/customer1/config.yaml
deleted file mode 100644
index 29054ee..0000000
--- a/config/schema/customer1/config.yaml
+++ /dev/null
@@ -1,363 +0,0 @@
-# Customer1 Configuration
-# Test customer for cross-border e-commerce search
-
-customer_name: "Customer1 Test Instance"
-
-# MySQL Database Configuration
-mysql_config:
- host: "120.79.247.228"
- port: 3316
- database: "saas"
- username: "saas"
- password: "P89cZHS5d7dFyc9R"
-
-# Table Configuration
-main_table: "shoplazza_product_sku"
-extension_table: "customer1_extension"
-
-# Elasticsearch Index
-es_index_name: "search_customer1"
-
-# ES Index Settings
-es_settings:
- number_of_shards: 1
- number_of_replicas: 0
- refresh_interval: "30s"
-
-# Field Definitions
-fields:
- # Primary Key
- - name: "skuId"
- type: "LONG"
- source_table: "main"
- source_column: "id"
- required: true
- index: true
- store: true
-
- # Text Fields - Multi-language
- - name: "name"
- type: "TEXT"
- source_table: "extension"
- source_column: "name"
- analyzer: "chinese_ecommerce"
- boost: 2.0
- index: true
- store: true
-
- - name: "name_pinyin"
- type: "TEXT"
- source_table: "extension"
- source_column: "name_pinyin"
- analyzer: "standard"
- boost: 1.5
- index: true
- store: false
-
- - name: "ruSkuName"
- type: "TEXT"
- source_table: "extension"
- source_column: "ruSkuName"
- analyzer: "russian"
- boost: 2.0
- index: true
- store: true
-
- - name: "enSpuName"
- type: "TEXT"
- source_table: "extension"
- source_column: "enSpuName"
- analyzer: "english"
- boost: 2.0
- index: true
- store: true
-
- # Category and Brand
- - name: "categoryName"
- type: "TEXT"
- source_table: "extension"
- source_column: "categoryName"
- analyzer: "chinese_ecommerce"
- boost: 1.5
- index: true
- store: true
-
- - name: "brandName"
- type: "TEXT"
- source_table: "extension"
- source_column: "brandName"
- analyzer: "chinese_ecommerce"
- boost: 1.5
- index: true
- store: true
-
- - name: "supplierName"
- type: "TEXT"
- source_table: "extension"
- source_column: "supplierName"
- analyzer: "chinese_ecommerce"
- boost: 1.0
- index: true
- store: true
-
- # Keyword Fields
- - name: "categoryName_keyword"
- type: "KEYWORD"
- source_table: "extension"
- source_column: "categoryName"
- index: true
- store: false
-
- - name: "brandName_keyword"
- type: "KEYWORD"
- source_table: "extension"
- source_column: "brandName"
- index: true
- store: false
-
- - name: "supplierName_keyword"
- type: "KEYWORD"
- source_table: "extension"
- source_column: "supplierName"
- index: true
- store: false
-
- # Price Fields
- - name: "price"
- type: "DOUBLE"
- source_table: "extension"
- source_column: "price"
- index: true
- store: true
-
- # Text Embedding Fields
- - name: "name_embedding"
- type: "TEXT_EMBEDDING"
- source_table: "extension"
- source_column: "name"
- embedding_dims: 1024
- embedding_similarity: "dot_product"
- index: true
-
- - name: "enSpuName_embedding"
- type: "TEXT_EMBEDDING"
- source_table: "extension"
- source_column: "enSpuName"
- embedding_dims: 1024
- embedding_similarity: "dot_product"
- index: true
-
- # Image Fields
- - name: "imageUrl"
- type: "KEYWORD"
- source_table: "extension"
- source_column: "imageUrl"
- index: true
- store: true
-
- - name: "image_embedding"
- type: "IMAGE_EMBEDDING"
- source_table: "extension"
- source_column: "imageUrl"
- embedding_dims: 1024
- embedding_similarity: "dot_product"
- nested: false
- index: true
-
- # Metadata Fields
- - name: "create_time"
- type: "DATE"
- source_table: "extension"
- source_column: "create_time"
- index: true
- store: true
-
- - name: "days_since_last_update"
- type: "INT"
- source_table: "extension"
- source_column: "days_since_last_update"
- index: true
- store: true
-
-# Index Structure (Query Domains)
-indexes:
- - name: "default"
- label: "默认索引"
- fields:
- - "name"
- - "enSpuName"
- - "ruSkuName"
- - "categoryName"
- - "brandName"
- analyzer: "chinese_ecommerce"
- boost: 1.0
- example: 'query=default:"消防套"'
- language_field_mapping:
- zh:
- - "name"
- - "categoryName"
- - "brandName"
- en:
- - "enSpuName"
- ru:
- - "ruSkuName"
-
- - name: "title"
- label: "标题索引"
- fields:
- - "name"
- - "enSpuName"
- - "ruSkuName"
- analyzer: "chinese_ecommerce"
- boost: 2.0
- example: 'query=title:"芭比娃娃"'
- language_field_mapping:
- zh:
- - "name"
- en:
- - "enSpuName"
- ru:
- - "ruSkuName"
-
- - name: "category"
- label: "类目索引"
- fields:
- - "categoryName"
- analyzer: "chinese_ecommerce"
- boost: 1.5
- example: 'query=category:"玩具"'
-
- - name: "brand"
- label: "品牌索引"
- fields:
- - "brandName"
- analyzer: "chinese_ecommerce"
- boost: 1.5
- example: 'query=brand:"ZHU LIN"'
-
-# Query Configuration
-query_config:
- supported_languages:
- - "zh"
- - "en"
- - "ru"
- default_language: "zh"
- enable_translation: true
- enable_text_embedding: true
- enable_query_rewrite: true
-
- # Translation API (DeepL)
- translation_service: "deepl"
- translation_api_key: null # Set via environment variable
-
-# Ranking Configuration(已弃用,保留用于文档说明)
-ranking:
- expression: "bm25() + 0.2*text_embedding_relevance()"
- description: "BM25 text relevance combined with semantic embedding similarity"
-
-# Function Score配置(ES层打分规则)
-# 约定:function_score是查询结构的必需部分
-function_score:
- score_mode: "sum" # multiply, sum, avg, first, max, min
- boost_mode: "multiply" # multiply, replace, sum, avg, max, min
-
- functions:
- # 1. Filter + Weight(条件权重)- 根据条件匹配提权
- - type: "filter_weight"
- name: "7天新品提权"
- filter:
- range:
- days_since_last_update:
- lte: 7
- weight: 1.3
-
- - type: "filter_weight"
- name: "30天新品提权"
- filter:
- range:
- days_since_last_update:
- lte: 30
- weight: 1.15
-
- - type: "filter_weight"
- name: "有视频提权"
- filter:
- term:
- is_video: true
- weight: 1.05
-
- # 示例:特定标签提权
- # - type: "filter_weight"
- # name: "特定标签提权"
- # filter:
- # term:
- # labelId_by_skuId_essa_3: 165
- # weight: 1.1
-
- # 示例:主力价格段提权
- # - type: "filter_weight"
- # name: "主力价格段"
- # filter:
- # range:
- # price:
- # gte: 50
- # lte: 200
- # weight: 1.1
-
- # 2. Field Value Factor(字段值映射)- 将数值字段映射为打分因子
- # 示例:在售天数
- # - type: "field_value_factor"
- # name: "在售天数因子"
- # field: "on_sell_days_boost"
- # factor: 1.0
- # modifier: "none" # none, log, log1p, log2p, ln, ln1p, ln2p, square, sqrt, reciprocal
- # missing: 1.0
-
- # 示例:销量因子
- # - type: "field_value_factor"
- # name: "销量因子"
- # field: "sales_count"
- # factor: 0.01
- # modifier: "log1p" # 对数映射,避免极端值影响
- # missing: 1.0
-
- # 示例:评分因子
- # - type: "field_value_factor"
- # name: "评分因子"
- # field: "rating"
- # factor: 0.5
- # modifier: "sqrt"
- # missing: 1.0
-
- # 3. Decay Functions(衰减函数)- 距离原点越远分数越低
- # 示例:时间衰减
- # - type: "decay"
- # name: "时间衰减"
- # function: "gauss" # gauss, exp, linear
- # field: "create_time"
- # origin: "now"
- # scale: "30d"
- # offset: "0d"
- # decay: 0.5
-
- # 示例:价格衰减
- # - type: "decay"
- # name: "价格衰减"
- # function: "linear"
- # field: "price"
- # origin: "100"
- # scale: "50"
- # decay: 0.5
-
-# Rerank配置(本地重排,当前禁用)
-rerank:
- enabled: false
- expression: ""
- description: "Local reranking (disabled, use ES function_score instead)"
-
-# SPU Aggregation (disabled for customer1)
-spu_config:
- enabled: false
- spu_field: null
- inner_hits_size: 3
-
diff --git a/config/schema/customer1/query_rewrite.dict b/config/schema/customer1/query_rewrite.dict
deleted file mode 100644
index 8e5ce37..0000000
--- a/config/schema/customer1/query_rewrite.dict
+++ /dev/null
@@ -1,4 +0,0 @@
-芭比 brand:芭比 OR name:芭比娃娃
-玩具 category:玩具
-消防 category:消防 OR name:消防
-
diff --git a/frontend/index.html b/frontend/index.html
index 53fe9f8..5d78ebc 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -121,9 +121,9 @@
-
+