【云岚到家】-day05-4-项目迁移-商品搜索

【云岚到家】-day05-4-项目迁移-商品搜索

  • 2 项目迁移-商品搜索
    • 2.1 迁移目标
    • 2.2 能力基础
      • 2.2.1 索引同步方案设计能力
      • 2.2.2 Elasticsearch全文检索应用能力
    • 2.3 需求分析
      • 2.3.1 界面原型
      • 2.3.2 功能列表梳理
    • 2.4 系统设计
      • 2.4.1 索引结构
      • 2.4.2 索引同步方案
      • 2.4.3 搜索自动补全
      • 2.4.4 同义词处理
      • 2.4.5 自定义词库
      • 2.4.6 深度分页方案


2 项目迁移-商品搜索

2.1 迁移目标

通过服务搜索的学习,将所学技术迁移到商品搜索,通过迁移有能力理解商品搜索的需求和设计内容。

通过全文检索技术进行搜索的场景非常多,通过迁移有能力根据需求分析不同场景下的搜索技术方案。

商品搜索:电商网站通常需要让用户能够快速地搜索和浏览大量商品。通过全文检索,可以实现对商品名称、描述、品牌等信息的快速搜索。

文档搜索:在企业或团队内,文档管理系统中包含了大量的文档、报告、合同等文件。全文检索可以提供便捷的搜索功能,使用户能够快速找到需要的文件。

新闻搜索:在新闻门户网站中,用户经常需要搜索和浏览大量的新闻文章。全文检索可以提供高效的搜索体验,帮助用户找到感兴趣的新闻。

论坛搜索:论坛和社交媒体平台上的用户生成内容庞大而复杂。通过全文检索,可以帮助用户找到相关的帖子、评论或用户。

2.2 能力基础

2.2.1 索引同步方案设计能力

使用ES进行商品搜索首先需要将数据库中的商品信息同步到Elasticsearch中,需要具备索引同步方案设计的能力,具体如下:

根据搜索需求定义索引结构。

参考本项目服务搜索的方案使用Canal+MQ将商品信息同步到ES中。

2.2.2 Elasticsearch全文检索应用能力

商品搜索不仅需要通过关键字进行检索,还需要进行过滤、排序等。

基于ES提供的API完成商品信息的搜索、过滤、排序等功能。

2.3 需求分析

2.3.1 界面原型

在这里插入图片描述

2.3.2 功能列表梳理

模块功能点详细介绍
关键字搜索输入关键词来搜索商品,搜索结果高亮显示用户可以输入关键词来搜索商品,系统应该能够根据关键词匹配商品的相关信息。
多条件过滤根据商品分类、价格范围、品牌、颜色、尺寸等进行过滤允许用户使用多种条件进行搜索,如商品分类、价格范围、品牌、颜色、尺寸等,以细化搜索结果。
搜索自动补全输入关键字显示自动补全的关键字主要涉及到对商品属性及属性值进行管理当用户输入关键词时,系统可以提供自动补全功能,帮助用户更快地找到相关商品。
搜索结果排序根据价格、销量、评论数、综合指标进行排序提供多种排序选项,让用户根据不同的标准对搜索结果进行排序,如价格、销量、评价等
同义词处理同义词定义处理同义词,确保用户能够使用不同的词汇描述相同的概念。
自定义词库根据自定义词库进行分词通常在以下情况下进行自定义词库,包括:领域专用术语、品牌、产品名词、地名、公司名等信息搜索时。
热门搜索推荐显示热门搜索关键字展示当前热门的搜索关键词,帮助用户发现流行的商品或主题。

2.4 系统设计

2.4.1 索引结构

商品检索goods结构如下:

{
    "settings": {
      "analysis": {
        "filter": {
          "synonym_filter": {
            "type": "synonym",
            "synonyms_path": "/usr/share/elasticsearch/data/goods_synonyms.txt"
          }
        },
        "analyzer": {
          "goods_analyzer": {
            "tokenizer": "standard",
            "filter": ["lowercase", "synonym_filter"]
          }
        }
      }
  },
  "mappings": {
    "properties": {
      "id":{
        "type": "long"
      },
      "name":{
        "type": "text",
        "analyzer": "goods_analyzer"
      },
      "name_c":{
        "type": "completion",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      },
      "brand_id":{
        "type": "long"
      },
      "category_id1":{
        "type": "long"
      },
      "category_id2":{
        "type": "long"
      },
      "category_id3":{
        "type": "long"
      },
      "list_url":{
        "type": "text"
      },
      "market_price":{
        "type": "integer"
      },
      "stock":{
        "type": "integer"
      },
      "evaluation_num":{
        "type": "integer"
      },
      "composite_score":{
        "type": "double"
      },
      "sale_num":{
        "type": "integer"
      },
      "create_time":{
        "type": "integer"
      },
      "express_ways":{
        "type": "integer"
      },
      "attr_value_ids":{
        "type": "long"
      }
    }
  }
}

字段说明:

id:商品spu id

name:商品spu名称,支持同义词词库

name_c:商品spu名称,支持自动补全

brand_id:品牌id

category_id1:一级分类id

category_id2:二级分类id

category_id3:三级分类id

list_url:商品列表展示图片url

market_price:市场价格,单位分

stock:整个商品spu的库存数量

evaluation_num:评价数量

composite_score:综合评分

sale_num:销量

create_time:创建时间,使用时间戳,用来判断是否是新品

express_ways:物流方式,可以指定多种物流渠道

attr_value_ids:属性值id列表

同义词文件:

/usr/share/elasticsearch/data/goods_synonyms.txt

2.4.2 索引同步方案

采用本项目讲解的Canal+MQ方案。

2.4.3 搜索自动补全

效果:

在这里插入图片描述

elasticsearch提供了Completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率,对于文档中字段的类型有一些约束:参与补全查询的字段必须是completion类型。

2.4.1中创建了商品索引结构,其中对名称进行了补全和分词设计,可以通过elasticsearch的建议对分词进行自动补全查询,方式如下:

POST /goods/_search
{
  "suggest":{
    "name_suggest":{
      "text":"搜索内容",
      "completion":{
          "field":"name_c",
          "size": 10,
          "skip_duplicates": true
      }
    }
  }
}

检索出商品名称中和输入内容相关的单词,并且去掉重复内容

2.4.4 同义词处理

在2.4.1索引结构中设计了同义词词库过滤器,其中配置了商品同义词词库文件/usr/share/elasticsearch/data/goods_synonyms.txt,向该文件中写入同义词即可,每一行为一个同义词词组,词语之间使用逗号隔开,例如:

电话,手机
香皂,肥皂

配置文件中配置了两对同义词词组,分别是电话,手机;香皂,肥皂。

2.4.5 自定义词库

在ik分词器的目录中可以通过配置文件配置扩展词库:

/data/soft/es7.17.7/xzb/plugins/ik/config/IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict"></entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

在文件中添加自定义库存:

在这里插入图片描述

市面上也有一些其它的方式:

  1. 配置远程词库地址

    在web服务器(nginx)创建自定义词库文件,配置远程访问词库的地址,找到配置文件elasticsearch/plugins/ik/config/,配置远程拓展字典访问地址,重启elasticsearch

  2. 基于数据库配置词库

    首先从 GitHub获取IK分词器插件的源码,地址:https://github.com/medcl/elasticsearch-analysis-ik,添加数据库配置,修改代码将原本从配置文件中读取词库改为从数据库中读取词库,添加定时任务,定时同步数据库中的词库,编译词库源码,并进行安装。

2.4.6 深度分页方案

搜索请求通常跨越多个分片。每个分片必须加载其请求的命中数和内存中任何先前页面的命中数。对于深层页面或大量结果,这些操作可以显着增加内存和 CPU 使用率,导致性能下降或节点故障

当查询分页深度较大时,汇总数据过多,对内存和CPU会产生非常大的压力,因此elasticsearch会禁止from+ size 超过10000的请求。

针对深度分页,ES提供了两种解决方案,(https://www.elastic.co/guide/en/elasticsearch/reference/7.17/paginate-search-results.html#search-after)

  • search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。
  • scroll滚动搜索:原理将排序后的文档id形成快照,保存在内存。官方已经不推荐使用。

search after实现:

在这里插入图片描述

查询第二页:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java---数组

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 无论c语言还是java数组都是重中之重&#xff0…

解决keil调试遇到的hardlfault问题

在程序开发过程中遇到的程序死机问题 导致死机的原因&#xff1a;内存溢出&#xff0c;堆栈溢出&#xff0c;数组越界&#xff0c;中断错误。。。。。。 出现这个问题&#xff0c;首先查看线程的调度关系 看最后是在哪个位置死机&#xff0c;如果rt_current_thread在main_thre…

视图库对接系列(GA-T 1400)十五、视图库对接系列(本级)删除、取消订阅

说明 之前说了订阅和修改订阅,今天我们来实现删除和取消订阅二个接口。删除订阅 逻辑: 请求下级的接口成功我们就删除数据库的对应数据视图库接口定义 实现 service接口层 //删除订阅ResponseStatusListModeObject deleteSubscribes(String idList, HttpServletRequest re…

MongoDB - 集合和文档的增删改查操作

文章目录 1. MongoDB 运行命令2. MongoDB CRUD操作1. 新增文档1. 新增单个文档 insertOne2. 批量新增文档 insertMany 2. 查询文档1. 查询所有文档2. 指定相等条件3. 使用查询操作符指定条件4. 指定逻辑操作符 (AND / OR) 3. 更新文档1. 更新操作符语法2. 更新单个文档 updateO…

土壤分析仪:解密土壤之奥秘的科技先锋

在农业生产和生态保护的道路上&#xff0c;土壤的质量与状况一直是我们关注的焦点。土壤分析仪&#xff0c;作为现代科技在农业和环保领域的杰出代表&#xff0c;以其高效、精准的分析能力&#xff0c;为我们揭示了土壤的奥秘&#xff0c;为农业生产提供了科学指导&#xff0c;…

(Windows环境)FFMPEG编译,包含编译x264以及x265

本文使用 MSYS2 来编译 ffmpeg 一、安装MSYS2 MSYS2 是 Windows 下的一组编译套件&#xff0c;它可以在 Windows 系统中模拟 Linux 下的编译环境&#xff0c;如使用 shell 运行命令、使用 pacman 安装软件包、使用 gcc (MinGW) 编译代码等。 MSYS2 的安装也非常省心&#x…

深度探讨:无法恢复主文件表的困境与解救之道

在数据存储与管理的复杂世界中&#xff0c;主文件表&#xff08;Master File Table, MFT&#xff09;作为文件系统的核心组件&#xff0c;承载着至关重要的角色。一旦遭遇无法恢复主文件表的困境&#xff0c;用户将面临数据访问受限、文件丢失等严重后果。这通常是由于硬件故障…

leetcode 1421 净现值查询(postgresql)

需求 表: NPV ---------------------- | Column Name | Type | ---------------------- | id | int | | year | int | | npv | int | ---------------------- (id, year) 是该表主键. 该表有每一笔存货的年份, id 和对应净现值的信息. 表: Queries ---------------------- …

C语言 | Leetcode C语言题解之第227题基本计算题II

题目&#xff1a; 题解&#xff1a; int calculate(char* s) {int n strlen(s);int stk[n], top 0;char preSign ;int num 0;for (int i 0; i < n; i) {if (isdigit(s[i])) {num num * 10 (int)(s[i] - 0);}if (!isdigit(s[i]) && s[i] ! || i n - 1) {s…

机器学习筑基篇,容器调用显卡计算资源,Ubuntu 24.04 快速安装 NVIDIA Container Toolkit!...

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Ubuntu 24.04 安装 NVIDIA Container Toolkit 什么是 NVIDIA Container Toolkit? 描述:NVIDIA Container Toolkit(容器工具包)使用户能够构建和运行 GPU 加速的容器,该工具包括一个容器运行时库和实用程序,用于自动…

Django项目创建的基本准备工作【4】

【 一 】软件开发模式 官话下面 人话 瀑布开发就是将什东西都定义好了在进行开发对吧 敏捷就是进行模块化一样 分批进行 规定一个时间段完成什么样的功能。 总结来说&#xff0c;瀑布开发强调在项目开始之前进行详细的计划和准备&#xff0c;并按照预定的顺序逐步进行&#x…

ScrapySharp框架:小红书视频数据采集的API集成与应用

引言 随着大数据时代的到来&#xff0c;数据采集成为了互联网企业获取信息的重要手段。小红书作为一个集社交和电商于一体的平台&#xff0c;其丰富的用户生成内容&#xff08;UGC&#xff09;为数据采集提供了丰富的资源。本文将介绍如何使用ScrapySharp框架进行小红书视频数…

aws sap认证考试如何轻松通过

如何高效备考AWS SAP (Solutions Architect Professional) 认证? AWS SAP认证是AWS认证体系中难度最高的认证之一,要通过这个考试确实需要下一番功夫。但通过合理规划和有效准备,你可以提高通过的几率。以下是一些建议: 评估起点 首先诚实地评估自己的AWS知识水平和实践经验。…

科普文:Java对象在堆中的内存结构

概叙 今天来讲些抽象的东西 -- 对象头&#xff0c;因为我在学习的过程中发现很多地方都关联到了对象头的知识点&#xff0c;例如JDK中的 synchronized锁优化 和 JVM 中对象年龄升级等等。 对象内存构成# Java 中通过 new 关键字创建一个类的实例对象&#xff0c;对象存于内存的…

Nginx -Web服务器/反向代理/负载均衡

文章目录 一、web服务1.1 nginx安装1.2 配置文件1.3 Nginx处理Web机制 二、反向代理三、负载均衡3.1 分类3.2 负载相关配置文件3.3 keepalive 提高吞吐量3.4 配置浏览器缓存 附、JMeter性能测试工具 以赛促学内容,大概率感觉会使用nginx做web服务,特对nginx做总结归纳. Nginx是…

DOM 基本操作 - 事件基础

theme: smartblue 一、事件概述 JavaScript使我们有能力创建动态页面&#xff0c;而事件是可以被JavaScript侦测到的行为。 简单理解: 触发---响应机制。 网页中的每个元素都可以产生某些可以触发JavaScript的事件&#xff0c;例如&#xff0c;我们可以在用户点击某按钮时产生一…

矩阵分解及其在机器学习中的应用

阵分解是一种广泛应用于数据挖掘和机器学习领域的技术&#xff0c;它通过将一个高维数据集分解为多个低维的数据集&#xff0c;以降低数据的复杂性、提高计算效率&#xff0c;并发现数据中的隐含结构。本文将详细介绍矩阵分解的基本概念、主要方法及其在机器学习中的应用。 一、…

【卡尔曼滤波器】DR_CAN :1_递归算法_做估计 学习笔记

DR_CAN : 1_递归算法_Recursive Processing 学习笔记 DR_CAN 大神 地址 1_递归算法_Recursive Processing 取平均 做估计 前k-1次的平均值 当前估计值 与上次估计值和当前测量值的关系

【Docker系列】Docker 镜像源:优化你的容器化开发流程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

前端/python脚本/转换-使用天地图下载的geojson(echarts4+如果直接使用会导致坐标和其他信息不全)

解决echarts4如果直接使用天地图下载的geojson会导致坐标和其他信息不全 解决方法是使用python脚本来补全其他信息&#xff1a;center&#xff0c;level&#xff0c;adcode等内容 前提是必须有一个之前使用的json文件&#xff08;需要全一点的数据供echarts使用&#xff09; …