MongoDB在自管理的基础架构上支持AI驱动的应用程序,提供企业级搜索功能。
行业: 零售
产品: MongoDB Search with Enterprise Server、MongoDB Vector Search with Enterprise Server、MongoDB Enterprise Server
解决方案概述
尽管云计算的采用速度不断加快,但许多客户数还是选择了自管理的基础架构和本地部署,尤其是在监管严格的行业中。根据这项调查,93% 的政府机构使用本地部署,其次是 IT 行业 91% 的组织和金融行业 90% 的组织。此外,许多 中小型企业(例如精品零售商或区域杂货连锁店)都使用本地部署,因为采用云架构的高昂费用构成了财务障碍。
虽然自管理的基础架构提供了灵活性、合规控制和数据主权,但它给寻求实现AI解决方案的组织带来了挑战。其中一些挑战包括:
架构复杂性:公司通常将单独的搜索引擎和矢量数据库结合起来,以实现向量搜索等高级搜索功能。
运营不堪重负:团队可能会难以同步不同的技术、托管不同的资源以及跨多个系统保持一致的工作流程。
为了解决这些障碍, MongoDB引入了 Search 和 Vector Search with MongoDB Enterprise Server。这些搜索功能启用您能够:
在任何基础架构上构建下一代AI应用:降低架构复杂性,从而更轻松地开发AI驱动的解决方案,并消除对多种单一用途技术的需要。
随时随地享受一致的体验:无论应用程序连接到何处,都使用相同的MQL API 。这样可以减少在生产和开发环境之间移动时的摩擦并提供灵活性。
该解决方案提供了一个演示,该演示使用MongoDB搜索和向量搜索来帮助用户使用由...提供支持的全文搜索或语义搜索来发现存储中的产品。它包括先决条件、架构要求以及在具有MongoDB Enterprise 服务器和搜索节点的环境中运行演示的分步说明。
图 1。演示的登陆页面
参考架构
要使用 Enterprise Server 的高级搜索功能,必须在Kubernetes集群中部署MongoDB Search 和 Vector Search 节点。这样就可以实现由...提供支持的全文搜索和语义搜索,从而允许用户根据说明或语义相似性查找项目。
您无需迁移现有数据库。使用运行MongoDB 8.0.10 的MongoDB Enterprise Edition版本或更高版本,在Kubernetes集群内部或外部。Kubernetes 操作符管理这些搜索节点并将它们安全地连接到数据库集群,无论其部署位置如何。
总之,您可以使用以下方法将MongoDB Search 和 Vector Search 与 Enterprise Server 集成:
部署在Kubernetes内的MongoDB Enterprise Edition
部署在Kubernetes外部的MongoDB Enterprise Edition
这两种部署架构都需要在Kubernetes中部署MongoDB Search 和 Vector Search 节点。以下部分介绍了每种方法。
在 Kubernetes 内安装 搜索 与 MongoDB Enterprise Edition
此部署选项直接在 Kubernetes 集群中设置 MongoDB 搜索 和 向量搜索 节点,以及 MongoDB Enterprise 服务器 实例,如演示中使用的那样。这种部署通过将所有组件维护在同一环境中来确保集成操作并简化管理。下图说明了此部署。
图 2。Kubernetes内的MongoDB Enterprise 服务器
在此解决方案中, Kubernetes集群托管 Enterprise Server、搜索节点和库存应用程序。这种架构简化了管理并确保组件之间的高效数据交换。
有关如何使用内部企业服务器配置设立搜索节点的分步说明,请参阅安装和使用 MongoDB Enterprise Edition 搜索。
在 Kubernetes 外部安装 搜索 With MongoDB Enterprise Edition
此部署选项在 Kubernetes 内部配置 MongoDB 搜索 和 向量搜索 节点,这些节点连接到部署在 Kubernetes 集群外部的 企业服务器 副本集。如果您在Kubernetes之外有基础架构要求或操作偏好,则可以使用此方法。下图说明了此部署。
图 3。Kubernetes之外的MongoDB Enterprise服务器
此配置允许您集成高级搜索功能,而无需更改现有的 Enterprise 服务器 基础架构。
有关如何使用外部 MongoDB Enterprise Edition 服务器配置安装 MongoDB 搜索 和 向量搜索 节点的分步说明,请参阅 安装和使用带有外部 MongoDB Enterprise Edition 的 MongoDB 搜索 和 向量搜索。
构建解决方案
请按照以下步骤设立并运行解决方案。
部署MongoDB Search 和 Vector Search 节点
按照“在MongoDB Enterprise Edition 中安装和使用搜索”教程中的步骤部署MongoDB搜索和向量搜索节点。
克隆存储库
有关必要的数据转储和应用程序配置,下载演示存储库:
git clone https://github.com/mongodb-industry-solutions/retail-unified-commerce
Go 转储文件目录:
cd ./retail-unified-commerce/docs/setup
导入演示数据
将示例存储库存数据导入到您的MongoDB部署中。
运行以下命令以检索连接字符串。将 <SECRET_NAME> 替换为部署期间生成的相应 kubernetes secret 名称:
kubectl get secret -n ${MDB_NS} <SECRET_NAME> -o yaml
此命令会打印密钥元数据及其编码内容。复制 connectionStringStandard 值并执行以下命令以获取连接字符串:
echo "<Base64EncodedConnectionString>" | base64 --decode
运行以下命令,从 collections 转储文件夹中恢复数据库:
mongorestore --uri "<CONNECTION_STRING>" ./collections
创建MongoDB Search 和 Vector Search 索引
使用连接字符串打开 mongosh 以连接到集群:
mongosh "<CONNECTION_STRING>" use retail-unified-commerce
运行以下命令以创建MongoDB搜索索引:
db.products.createSearchIndex("product_atlas_search", { "mappings": { "dynamic": false, "fields": { "brand": { "type": "string" }, "category": { "type": "string" }, "inventorySummary": { "fields": { "storeObjectId": { "type": "objectId" } }, "type": "document" }, "productName": { "type": "string" }, "subCategory": { "type": "string" } } } })
运行以下命令以创建MongoDB Vector Search索引:
db.products.createSearchIndex({ name: "product_text_vector_index", type: "vectorSearch", definition: { fields: [ { type: "vector", path: "textEmbeddingVector", numDimensions: 1024, similarity: "cosine" }, { type: "filter", path: "inventorySummary.storeObjectId" }, { type: "filter", path: "inventorySummary.inStock" } ] } })
运行以下命令,确认两个索引均已正确创建。如果成功,该命令将返回 product_atlas_search 和 product_text_vector_index 的元数据。
JSON.stringify(db.runCommand({listSearchIndexes: "products"}), null, 2)
使用以下查询测试索引:
db.products.aggregate([ { "$search": { "index": "product_atlas_search", "compound": { "should": [ { "text": { "query": "Chicken Masala", "path": ["productName", "brand", "category", "subCategory"], "fuzzy": { "maxEdits": 2 }, } } ] }, } }, { $project: { productName: 1, score: { $meta: "searchScore" } } }, { $limit: 2 } ])
此查询返回产品名称及其搜索分数的列表:
[ { _id: ObjectId("685bfe2d3d832cf7e1614edc"), productName: "Chicken Masala", score: 8.192384719848633, }, { _id: ObjectId("685bfe2e3d832cf7e16159fe"), productName: "Shahi Chicken Masala", score: 7.7956156730651855, }, ];
配置并运行演示
在 backend/advanced-search-ms目录中创建一个 .env文件,在 frontend目录中创建另一个文件。您可以在这些目录中找到一个 .env.template文件。使用之前检索的连接字符串更新占位符。
有关其他上下文和可选设置配置,请参阅 GitHub 存储库的 README。
您可以在本地或Kubernetes上部署演示。
运行以下代码:
make build
确保可以使用您的首选方法在本地主机上访问前端和后端服务。然后,在 http://localhost:3000/product-inventory 中打开浏览器。
使用为演示构建的Docker映像在Kubernetes集群内运行后端和前端。请按以下步骤操作:
1。构建并推送Docker映像
通过执行以下命令,构建后端和前端映像并将其推送到容器注册表:
Backend docker build --platform linux/amd64 -t retail-backend:latest ./backend/advanced-search-ms docker tag retail-backend:latest <YOUR_REGISTRY>/retail-backend:latest docker push <YOUR_REGISTRY>/retail-backend:latest Frontend docker build --platform linux/amd64 -t retail-frontend:latest ./frontend docker tag retail-frontend:latest <YOUR_REGISTRY>/retail-frontend:latest docker push <YOUR_REGISTRY>/retail-frontend:latest
根据计算机的架构,可能需要 --platform linux/amd64 标志。
2。创建Kubernetes密钥
Store sensitive values in a Kubernetes secret file named retail-secrets.yaml within the retail-unified-commerce/k8s folder. Do not commit real credentials to source control. Below is an example template:
# retail-unified-commerce/k8s/retail-secrets.yaml apiVersion: v1 kind: Secret metadata: name: retail-secrets namespace: default type: Opaque data: NEXT_PUBLIC_GOOGLE_MAPS_API_KEY: VOYAGE_API_KEY: stringData: MONGODB_URI: <YOUR_CONNECTION_STRING> DB_NAME: "retail-unified-commerce" NEXT_PUBLIC_COLLECTION_PRODUCTS: "products" NEXT_PUBLIC_COLLECTION_INVENTORY: "inventory" NEXT_PUBLIC_COLLECTION_STORES: "stores" SEARCH_INDEX: "product_atlas_search" NEXT_PUBLIC_BACKEND_ENDPOINT: "<YOUR_BACKEND_ENDPOINT>" NEXT_PUBLIC_ENABLE_ATLAS_SEARCH: "true" NEXT_PUBLIC_ENABLE_VECTOR_SEARCH: "true" NEXT_PUBLIC_ENABLE_HYBRID_SEARCH: "true" NEXT_PUBLIC_ENABLE_FULLTEXT_SEARCH: "true" MONGODB_DATABASE: "retail-unified-commerce" PRODUCTS_COLLECTION: "products" SEARCH_TEXT_INDEX: "product_atlas_search" SEARCH_VECTOR_INDEX: "product_text_vector_index" NEXT_PUBLIC_SEARCH_META_INDEX: "product_atlas_search_meta" EMBEDDING_FIELD_NAME: "textEmbeddingVector" VOYAGE_API_URL: "https://api.voyageai.com/v1" VOYAGE_MODEL: "voyage-3-large"
将密钥应用于集群:
kubectl apply -f k8s/retail-secrets.yaml
3。部署后端和前端
将 backend-deployment.yaml 模板放入 /k8s目录中:
# retail-unified-commerce/k8s/backend-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: retail-backend spec: replicas: 2 selector: matchLabels: app: retail-backend template: metadata: labels: app: retail-backend spec: containers: - name: backend image: <YOUR_REGISTRY>/retail-backend:latest ports: - containerPort: 8000 envFrom: - secretRef: name: retail-secrets apiVersion: v1 kind: Service metadata: name: retail-backend-service spec: type: LoadBalancer selector: app: retail-backend ports: - port: 80 targetPort: 8000
将 frontend-deployment.yaml 模板放入 /k8s目录中:
# retail-unified-commerce/k8s/frontend-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: retail-frontend spec: replicas: 2 selector: matchLabels: app: retail-frontend template: metadata: labels: app: retail-frontend spec: containers: - name: frontend image: <YOUR_REGISTRY>/retail-frontend:latest ports: - containerPort: 3000 envFrom: - secretRef: name: retail-secrets apiVersion: v1 kind: Service metadata: name: retail-frontend-service spec: type: LoadBalancer selector: app: retail-frontend ports: - port: 80 targetPort: 3000
应用Kubernetes部署:
kubectl apply -f k8s/backend-deployment.yaml kubectl apply -f k8s/frontend-deployment.yaml
验证您的部署:
kubectl get pods -o wide kubectl get svc -o wide
等待为前端和后端服务分配 EXTERNAL-IP。
4。访问演示
显示前端服务的外部IP后,使用以下链接将其打开:http://<EXTERNAL-IP>/product-inventory。
探索演示的搜索功能
Select the MongoDB Search option and enter queries that don't exactly match product names. For example, use a term like green tea face mask or a typo like cukie. These queries demonstrate the system’s ability to return relevant results when the input is imprecise.
图 4。绿茶面膜 搜索结果
切换到MongoDB 向量搜索选项以体验语义理解。使用描述性查询或基于意图的查询,例如给少女的礼物或高蛋白辛辣小吃。系统会显示与查询含义一致的结果,而不仅仅是所使用的单词。
图 5。给少女的礼物的向量搜索结果
在这两个结果中,您可以查看每个产品卡片左上角显示的搜索分数。该分数表示结果与查询的相关性。
关键要点
本地部署具有战略重要性:本地部署对于优先考虑数据主权和控制的行业和组织仍然至关重要。此公开预览版使组织能够在其本地部署环境中采用AI ,确保保持竞争力并满足合规要求。
简化的技术堆栈可加速AI 的采用: MongoDB 搜索 和 向量搜索 with Enterprise 服务器 通过整合各种技术、降低架构复杂性以及允许在不迁移操作数据的情况下允许智能搜索查询启用强大的AI应用程序。
高级搜索功能提升用户体验:全文搜索和向量搜索优化了用户探索和访问权限信息的方式,为不同行业带来更直观的体验。
作者
Angie Guemes Estrada, MongoDB
Rodrigo Leal, MongoDB
Prashant Juttukonda, MongoDB
了解详情
要在Kubernetes集群中部署MongoDB Search 和 Vector Search,请访问部署MongoDB Search 和 Vector Search。
要学习有关MongoDB Community Edition和MongoDB Enterprise 服务器的搜索和向量搜索功能,请阅读使用搜索和向量搜索功能增强自管理应用程序。
要了解MongoDB如何推动零售创新,请访问MongoDB for 零售。