用OpenSearch实现电商语义搜索

张开发
2026/4/14 20:49:55 15 分钟阅读

分享文章

用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: DEPLOYED4.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:Opensearch2026 -k \ https://localhost:9200/_bulk \ --data-binary products.json \ -H Content-Type: application/json # 每行应显示 result:created, status:2015、执行语义搜索数据摄取完成后您可以使用神经搜索查询POST /ecommerce-products/_search { query: { neural: { product_vector: { query_text: 适合团队通话的经济型无线耳机, model_id: your_model_id, k: 10 } } } }即使查询中没有精确匹配的商品标题系统也会返回语义相似的结果如带降噪的蓝牙耳机。6、常见问题与解决方案6.1 内存不足错误如果模型部署失败增加 OpenSearch 的内存分配# 在 jvm.options 文件中 -Xms4g -Xmx4g6.2 模型加载失败确保所有 ML Commons 插件已正确安装# 检查已安装插件 ./opensearch-plugin list6.3 向量维度不匹配确保模型输出维度与索引映射中的 dimension 设置匹配。7、结束语通过将 OpenSearch 的 k-NN 功能与开源嵌入模型结合您可以构建企业级的语义搜索解决方案而无需昂贵的 API 费用或外部依赖。这种方法不仅提高了搜索相关性还为个性化推荐和智能商品发现奠定了基础。原文链接用OpenSearch实现电商语义搜索 - 汇智网

更多文章