谷粒商城实战笔记-128-商城业务-商品上架-sku在es中存储模型分析-关键

文章目录

  • 一,Elasticsearch在谷粒商城中的应用
    • 1,商城的商品检索
    • 2,日志检索
  • 二,谷粒商城ES的商品索引mapping如何设计
    • 1,商品索引product的mapping
      • 冗余 SPU 信息的原因
      • 第一种方案的优缺点:
        • 优点:
        • 缺点:
      • 第二种方案(SPU 单独存储)的优缺点
        • 优点:
        • 缺点:
      • 选择第一种方案的理由
    • 2,mapping设计核心点
      • 2.1 index: false
      • 2.2 `doc_values: false`
      • 3. 唯一的全文检索属性
      • 4,总结

一,Elasticsearch在谷粒商城中的应用

这一节的内容非常重要,讲述了ES在商城中如何使用,从大的方面来说,主要有两大场景:

  • 商城的商品检索
  • 系统日志检索

1,商城的商品检索

第一种检索:根据三级分类检索。

鼠标移到左侧的三级分类,右侧列出更详细的分类信息,点击其中一个分类,比如办公桌,前端页面会向后台发出请求,商品服务接受到请求后会从ES中根据分类检索到这个分类下的SPU,并返回给前端展示。
在这里插入图片描述

第二种检索:根据SKU标题检索。

如下图,输入关键词公主笔记本进行搜索,前端页面发出请求,后端接收到请求后,根据关键词在ES中进行全文搜索,并整理搜索到的结果的属性值,进行分类汇总,把整理过的属性值(对应下图第一部分)和搜索到的SPU返回给前端进行展示(对应下图第二部分)。

注意,第一部分是根据搜索结果的属性值动态分类汇总而来。

在这里插入图片描述

2,日志检索

有过较大项目微服务开发经验的同学,对日志检索应该非常熟悉。对于排查测试和开发环境中的问题来说,日志检索必不可少。

二,谷粒商城ES的商品索引mapping如何设计

1,商品索引product的mapping

执行如下请求,创建商品索引product。

PUT product
{
"mappings": {
"properties": {
"skuId": {
"type": "long"
},
"spuId": {
"type": "keyword"
},
"skuTitle": {
"type": "text",
"analyzer": "ik_smart"
},
"skuPrice": {
"type": "keyword"
},
"skuImg": {
"type": "keyword",
"index": false,
"doc_values": false
},
"saleCount": {
"type": "long"
},
"hasStock": {
"type": "boolean"
},
"hotScore": {
"type": "long"
},
"brandId": {
"type": "long"
},
"catalogId": {
"type": "long"
},
"brandName": {
"type": "keyword",
"index": false,
"doc_values": false
},
"brandImg": {
"type": "keyword",
"index": false,
"doc_values": false
},
"catalogName": {
"type": "keyword",
"index": false,
"doc_values": false
},
"attrs": {
"type": "nested",
"properties": {
"attrId": {
"type": "long"
},
"attrName": {
"type": "keyword",
"index": false,
"doc_values": false
},
"attrValue": {
"type": "keyword"
}
}
}
}
}
}

设计商品mapping结构时,有两种方案:

  • 第一种方案是每一个sku文档都冗余spu信息
  • 另一种方案是把spu信息单独保存,检索时通过spuId关联sku信息。

我们最终采用的是第一种方案,理论依据就是用空间换时间,追求检索的高效率。具体分析如下。

冗余 SPU 信息的原因

  1. 查询性能:

    • 直接在 SKU 文档中包含 SPU 的关键信息(如 spuId)可以避免在查询时进行额外的关联操作。
    • 这样做可以减少对其他索引或文档的访问,从而加快查询速度。
  2. 可扩展性:

    • 当 SKU 和 SPU 的数量都非常大时,减少索引之间的依赖关系可以提高系统的整体性能。
    • 如果 SPU 信息被频繁地用于 SKU 查询,那么将它们内联在 SKU 记录中可以简化查询逻辑。

第一种方案的优缺点:

优点:
  • 查询效率:直接从 SKU 文档获取所有所需信息,无需进行额外的关联查询。
  • 易于维护:简化了数据模型和查询逻辑。
缺点:
  • 存储开销:每个 SKU 都会携带完整的 SPU 信息,可能会增加存储空间的需求。
  • 数据更新:如果 SPU 信息发生变化,需要更新所有相关 SKU 的记录以保持一致性。

第二种方案(SPU 单独存储)的优缺点

优点:
  • 存储效率:避免了冗余数据,节省存储空间。
  • 数据管理:更容易管理和更新 SPU 数据,只需在一个地方更新即可。
缺点:
  • 查询复杂度:需要额外的关联查询来获取完整的 SPU 信息,这可能导致查询性能下降。

选择第一种方案的理由

  • 性能优先:如果你的应用程序需要非常快速的响应时间,并且查询 SKU 时经常需要 SPU 的相关信息,那么将 SPU 信息内联到 SKU 记录中可以显著提高性能。
  • 简单性:对于复杂的查询,内联 SPU 信息可以减少开发和维护的成本。

2,mapping设计核心点

这个映射定义中的几个核心点如下:

2.1 index: false

当一个字段设置为 index: false 时,意味着该字段不会被索引,因此无法进行基于该字段的搜索。例如,在这个映射中,skuImg, brandName, brandImg, catalogName, 和 attrs.attrName 字段都被设置为 index: false。这意味着这些字段将不参与全文检索,也无法通过这些字段进行过滤或排序。

2.2 doc_values: false

doc_values 是一个字段级别的设置,它控制是否存储该字段的值以便于排序、聚合或脚本使用。当 doc_values: false 时,表示该字段不会存储任何文档级别的值,也就意味着不能基于这些字段进行排序或聚合。

3. 唯一的全文检索属性

在这个映射中,唯一被标记为全文检索的属性是 skuTitle,其类型为 text 并且使用了 ik_smart 分词器。这意味着 skuTitle 字段支持全文检索功能,并且在搜索时会使用 ik_smart 分词器进行分词处理,以实现更智能的中文搜索结果。

4,总结

  1. index: false 的目的:

    • 减少存储开销:不索引这些字段可以节省存储空间。
    • 提高性能:不需要维护索引,可以提高写入性能。
    • 简化查询:不需要考虑这些字段在查询中的使用。
  2. doc_values: false 的目的:

    • 减少存储开销:不存储文档级别的值可以进一步减少存储空间的需求。
    • 提高性能:不需要维护文档级别的值,可以提高写入性能。
    • 限制使用场景:不能基于这些字段进行排序或聚合。
  3. 全文检索属性:

    • skuTitle 被设计成全文检索属性,允许用户基于产品标题进行搜索。
    • 使用 ik_smart 分词器,可以提供更精细的中文分词能力,从而提高搜索质量。

结合这些特点,可以推得出以下几点:

  • 设计意图:

    • 映射的设计倾向于优化性能,以空间换时间。
    • 重点放在了 skuTitle 上,因为这是用户最有可能用来搜索产品的字段。
    • 其他字段主要用于参考或显示用途,而不是作为查询条件。
  • 应用场景:

    • 适用于那些需要高效搜索的产品目录系统,其中产品标题是最主要的搜索依据。
    • 对于其他字段的查询需求较低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/391925.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苍穹外面day13(day10)---订单状态定时处理、来单提醒和客户催单

Spring Task 同学们可以看我这篇文章 Spring Task初学-CSDN博客 订单状态定时处理 新建OrderTask /*** 定时任务类,定时处理订单状态*/ Component Slf4j public class OrderTask {Autowiredprivate OrderMapper orderMapper;/*** 处理超时订单的方法*/Scheduled(c…

SQL数据库备份

转载:数据库备份与还原 1. 以下过程为记录客户单位备份过程。 一般有E盘选择E盘备份,否则选择D盘备份。选中备份文件需要重命名,以防原文件被覆盖。切换选项,选中压缩备份。

网络安全入门教程(非常详细)从零基础入门到精通!

一、引言 在当今高度数字化的时代,网络如同一张无形的大网,将世界紧密连接在一起。然而,在这看似便捷与美好的背后,却隐藏着无数的风险与威胁。网络安全已成为捍卫个人隐私、企业机密乃至国家安全的关键防线。如果您怀揣着对网络世…

VSCode上安装C#环境教程

本章教程,教你如何在vscode上,可以快速运行一些基础的c#代码。 1、下载 .NET Code SDK 下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/sdk-for-vs-code?utm_source=vs-code&utm_medium=referral&utm_campaign=sdk-install 根据自己的操作系统,选择…

Java_微服务

首先介绍一下单体架构与微服务架构: 单体架构: 微服务: SpringCloud: 版本: 标黑部分为目前企业使用最多的版本,因为它支持jdk8、jdk11,下面使用SpringCloud也会使用这个版本。 服务拆分&…

【GLM-4开发实战】Function Call进阶实战:外部函数调用回顾

系列篇章💥 No.文章1【GLM-4开发实战】Function Call进阶实战:外部函数调用回顾2【GLM-4开发实战】Function Call进阶实战:常见挑战之意图识别处理3【GLM-4开发实战】Function Call进阶实战:常见挑战之海量函数处理4【GLM-4开发实…

黑马头条vue2.0项目实战(五)——首页—频道编辑

目录 1. 使用页面弹出层 1.1 页面弹出层简单使用 1.2 创建频道编辑组件 1.3 页面布局 2. 展示我的频道 3. 展示推荐频道列表 3.1 获取所有频道 3.2 处理展示推荐频道 4. 添加频道 5. 编辑频道 5.1 处理编辑状态 5.2 切换频道 5.3 让激活频道高亮 5.4 删除频道 6.…

基于RK3588+AI支持能源在线监测系统应用的AIOT产品方案

支持能源在线监测系统应用的AIOT产品方案 近年来,智慧能源行业受益于国家政策扶持、市场需求拉动和先进技术支撑呈现出了蓬勃发展态势。助推智慧能源发展,打造了支持能源在线监测系统应用的AIOT产品方案。 能源在线监测系统的市场潜力 随着社会经济的飞…

Python | Leetcode Python题解之第319题灯泡开关

题目: 题解: class Solution:def bulbSwitch(self, n: int) -> int:return int(sqrt(n 0.5))

C++商店管理系统

代码中使用了C11的特性 后面有些输出(cout输出的)的提示文本是英文,因为懒得敲中文 源码在最后面 文末投票参与一下谢谢 商品数据保存在 items.txt 用户数据保存在 users.txt 实现功能 1.添加商品(商品ID,商品名,库存数量,价格&a…

分享一个基于人脸识别的小区物业管理系统Spring Boot(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

Liunx 小程序之进度条

Liunx 小程序之进度条 效果前提条件回车和换行缓冲区倒计时 进度条纯进度条模拟下载的进度条Progressbar.hProgressbar.cmain.cmakefile 效果 先来看效果,这其实是一个动态的进度条,后有源码,运行即可: 前提条件 在制作之前有两…

数论基础知识(上)

目录 数学符号 整除与约数 最大公约数(gcd)和最小公倍数(lcm) 质数 (素数) 算术基本定理(唯一分解定理) 约数个数 约数之和 分解质因数(枚举法) 试除法求约数(枚举法) 数学…

RTSP系列四:RTSP Server/Client实战项目

RTSP系列: RTSP系列一:RTSP协议介绍-CSDN博客 RTSP系列二:RTSP协议鉴权-CSDN博客 RTSP系列三:RTP协议介绍-CSDN博客 RTSP系列四:RTSP Server/Client实战项目-CSDN博客 目录 一、RTSP Server实战项目 1、准备 2、…

F4Pan网盘解析获取下载链接的工具系统源码

F4Pan网盘解析获取下载链接的工具系统源码,F4Pan(下称本项目)使用的接口全部来自于官方,无任何破坏接口的行为,本项目所有代码全部开源,仅供学习参考使用,请遵守相关的法律法规,禁止商用,若无视…

java+springboot+mysql校园二手书销售平台设计与实现00895-计算机毕业设计项目选题推荐(附源码)

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对校园二手书销售平台等问题,对校…

快速体验LLaMA-Factory 私有化部署和高效微调Llama3模型FAQ

序言 之前已经介绍了在超算互联网平台SCNet上使用异构加速卡AI 显存64GB PCIE,私有化部署Llama3模型,并对 Llama3-8B-Instruct 模型进行 LoRA 微调、推理和合并 ,详细内容请参考另一篇博客:快速体验LLaMA-Factory 私有化部署和高…

计算机网络基础 - 计算机网络和因特网(2)

计算机网络基础 计算机网络和因特网Internet 结构和 ISP分组延时、丢失和吞吐量四种分组延时分组丢失吞吐量 协议层次及其服务模型概念数据单元(DU)协议栈TCP/IP 协议各层次的协议数据单元IOS/OSI 参考模型 计算机网络和因特网的历史早期计算机网路&…

自动驾驶的六个级别是什么?

自动驾驶汽车和先进的驾驶辅助系统(ADAS)预计将帮助拯救全球数百万人的生命,消除拥堵,减少排放,并使我们能够在人而不是汽车周围重建城市。 自动驾驶的世界并不只由一个维度组成。从没有任何自动化到完整的自主体验&a…

偷懒神器:auto 的讲解

1. auto 的定义 在c/c11之前,auto用来修饰局部变量,表明该变量是一个自动变量,函数结束后该变量销毁   c11中,赋予auto全新的含义。其中表示:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来…