用OpenSearch实现电商语义搜索
想象一下,一位顾客搜索"适合团队通话的经济型无线耳机"。传统的关键词搜索返回零结果,因为您的商品标题中并不包含所有这些确切词汇。但借助由生成式 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
汇智网翻译整理,转载请标明出处