用OpenSearch实现电商语义搜索

通过将 OpenSearch 的 k-NN 功能与开源嵌入模型结合,您可以构建企业级的语义搜索解决方案,而无需昂贵的 API 费用或外部依赖。

用OpenSearch实现电商语义搜索
微信 ezpoda免费咨询:AI编程 | AI模型微调| AI私有化部署
AI工具导航 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo

想象一下,一位顾客搜索"适合团队通话的经济型无线耳机"。传统的关键词搜索返回零结果,因为您的商品标题中并不包含所有这些确切词汇。但借助由生成式 AI 嵌入模型驱动的语义搜索,OpenSearch 能够理解用户意图——并将您最好的带降噪功能的蓝牙耳机置顶展示。

在本指南中,我们将在 OpenSearch 2.13 基础上构建一个完整的神经搜索流程:摄取电商商品数据,使用预训练的句子转换模型在摄取过程中自动生成向量嵌入,并提供具有语义感知能力的搜索结果——无需任何外部服务或付费 API。

1、为什么电商需要神经搜索?

在开始编写代码之前,让我们明确我们要解决什么问题以及业务收益是什么。

  • 减少零结果搜索: 遇到死胡同的购物者会离开。语义搜索匹配同义词、改写和意图——大幅减少"无结果"页面。
  • 低于10毫秒的查询延迟: OpenSearch 的 HNSW 图索引支持近似最近邻搜索,以关键词搜索的速度提供相似性结果。
  • 更好的推荐: 通过向量距离计算商品相似性,驱动"您可能也喜欢"功能——使用相同索引,无需额外基础设施。
  • 100%开源且免费: 没有 OpenAI API 费用,没有供应商锁定。嵌入模型在 Apache 2.0 许可下运行在您的 OpenSearch 节点内部。

2、传统搜索 vs 神经搜索

特性 传统关键词搜索 神经语义搜索
匹配方式 精确词汇匹配 语义相似性
同义词支持 需要手动配置 自动理解
查询理解 字面匹配 理解意图
结果相关性 依赖关键词密度 基于语义相关性

3、架构设计

本文档包含架构图,展示了数据流:从商品数据摄取到向量生成再到语义搜索查询的完整流程。

4、分步实现指南

4.1 在节点上启用机器学习

默认情况下,OpenSearch 将 ML 推理限制在专用 ML 节点上。在单节点或开发环境中,告诉集群任何节点都可以运行模型:

PUT /_cluster/settings
{
  "persistent": {
    "plugins.ml_commons.only_run_on_ml_node": false,
    "plugins.ml_commons.native_memory_threshold": 99,
    "plugins.ml_commons.model_auto_redeploy.enable": true,
    "plugins.ml_commons.model_auto_redeploy.lifetime_retry_times": 3
  }
}

4.2 注册嵌入模型

OpenSearch 的 ML Commons 维护一个经过预测试的 TorchScript 兼容模型注册表。我们使用 msmarco-distilbert-base-tas-b —— 一个768维的模型,针对问答段落检索进行了优化,非常适合商品搜索。

POST /_plugins/_ml/models/_register
{
  "name": "huggingface/sentence-transformers/msmarco-distilbert-base-tas-b",
  "version": "1.0.2",
  "model_format": "TORCH_SCRIPT"
}

// 返回:
// { "task_id": "abc123", "status": "CREATED" }

4.3 部署模型

POST /_plugins/_ml/models/<your_model_id>/_deploy

// 轮询返回的 task_id 直到状态变为 COMPLETED
GET /_plugins/_ml/tasks/<deploy_task_id>

// 确认部署状态:
GET /_plugins/_ml/models/<your_model_id>
// 查找:"model_state": "DEPLOYED"

4.4 创建摄取管道

摄取管道是实现无缝批量摄取的魔法所在。流经它的每个文档都将自动将其商品描述字段转换为768维向量存储在 product_vector 字段中。

PUT /_ingest/pipeline/ecommerce-neural-pipeline
{
  "description": "Auto-embed product descriptions for semantic search",
  "processors": [
    {
      "text_embedding": {
        "model_id": "<your_model_id>",
        "field_map": {
          "product_description": "product_vector"
          // ↑ 文档中的源字段 → ↑ 新的向量字段
        }
      }
    }
  ]
}

4.5 创建电商索引

PUT /ecommerce-products
{
  "settings": {
    "index.knn": true,  // 在此索引上启用 k-NN
    "default_pipeline": "ecommerce-neural-pipeline",
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "product_id": { "type": "keyword" },
      "product_name": { "type": "text" },
      "product_description": { "type": "text" },  // 嵌入的源字段
      "brand": { "type": "keyword" },
      "category": { "type": "keyword" },
      "price": { "type": "float" },
      "in_stock": { "type": "boolean" },
      "product_vector": {  // 由管道自动填充
        "type": "knn_vector",
        "dimension": 768,  // 必须与模型输出匹配
        "method": {
          "name": "hnsw",
          "space_type": "cosinesimil",
          "engine": "nmslib"
        }
      }
    }
  }
}

4.6 准备和摄取商品数据

将商品数据准备为 OpenSearch Bulk API 格式的 JSON 文件:

{"index":{"_index":"ecommerce-products"}}
{
  "product_id": "SKU-001",
  "product_name": "Plantronics HW251N SupraPlus 宽带耳机",
  "product_description": "专业降噪耳机,适用于办公室和呼叫中心。宽带音频提供清晰通话。QD 快速断开。单耳头戴式设计。",
  "brand": "Plantronics",
  "category": "耳机",
  "price": 89.99,
  "in_stock": true
}
{"index":{"_index":"ecommerce-products"}}
{
  "product_id": "SKU-002",
  "product_name": "Jabra Evolve2 85 无线耳机",
  "product_description": "高端无线耳机,配备主动降噪功能。37小时电池续航。非常适合远程工作、视频会议和专注时段。",
  "brand": "Jabra",
  "category": "耳机",
  "price": 379.00,
  "in_stock": true
}

通过 curl 摄取数据——管道会自动为每个文档执行:

# 设置 k-NN 本地库路径(WSL2 环境需要)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/softwares/opensearch-2.13.0/plugins/opensearch-knn/lib

# 批量摄取
curl -XPOST -u "admin:Opensearch@2026" -k \
  https://localhost:9200/_bulk \
  --data-binary @products.json \
  -H 'Content-Type: application/json'

# 每行应显示 "result":"created", "status":201

5、执行语义搜索

数据摄取完成后,您可以使用神经搜索查询:

POST /ecommerce-products/_search
{
  "query": {
    "neural": {
      "product_vector": {
        "query_text": "适合团队通话的经济型无线耳机",
        "model_id": "<your_model_id>",
        "k": 10
      }
    }
  }
}

即使查询中没有精确匹配的商品标题,系统也会返回语义相似的结果,如带降噪的蓝牙耳机。

6、常见问题与解决方案

6.1 内存不足错误

如果模型部署失败,增加 OpenSearch 的内存分配:

# 在 jvm.options 文件中
-Xms4g
-Xmx4g

6.2 模型加载失败

确保所有 ML Commons 插件已正确安装:

# 检查已安装插件
./opensearch-plugin list

6.3 向量维度不匹配

确保模型输出维度与索引映射中的 dimension 设置匹配。

7、结束语

通过将 OpenSearch 的 k-NN 功能与开源嵌入模型结合,您可以构建企业级的语义搜索解决方案,而无需昂贵的 API 费用或外部依赖。这种方法不仅提高了搜索相关性,还为个性化推荐和智能商品发现奠定了基础。


原文链接: Supercharge Your E-Commerce Search with OpenSearch & GenAI

汇智网翻译整理,转载请标明出处