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

news2024/10/8 12:48:55

【云岚到家】-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实现:

在这里插入图片描述

查询第二页:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot项目架构实战之“网关zuul搭建“

第三章 网关zuul搭建 前言&#xff1a; 1、主要功能 zuul主要提供动态路由&#xff08;内置ribbon实现&#xff09;和过滤&#xff08;可以做统一鉴权过滤器、灰度发布过滤器、黑白名单IP过滤器、服务限流过滤器&#xff08;可以配合Sentinel实现&#xff09;&#xff09;功能…

【IT领域新生必看】解锁 `final` 关键字的秘密:Java 编程中的终极武器

文章目录 引言什么是 final 关键字&#xff1f;一、 final 变量final 局部变量final 实例变量final 静态变量 二、 final 方法三、 final 类四、 final 关键字的实际应用1. 定义常量2. 防止方法被重写3. 创建不可变类4. 优化性能 五、 final 的一些常见误区1. final 变量不能在…

力扣2356.二维差分模板——子矩阵元素加1

力扣2356.二维差分模板——子矩阵元素加1 模板题 最后将n2*n2的矩阵删去周围一圈变成n*n矩阵的操作 class Solution {public:vector<vector<int>> rangeAddQueries(int n, vector<vector<int>>& queries) {vector<vector<int>> res…

ONLYOFFICE 8.1版本版本桌面编辑器测评

ONLYOFFICE官网链接&#xff1a;ONLYOFFICE - 企业在线办公应用软件 | ONLYOFFICE ONLYOFFICE在线办公套件&#xff1a;在线办公套件 | ONLYOFFICE ONLYOFFICE在线PDF编辑器、阅读器和转换器&#xff1a;在线PDF查看器和转换器 | ONLYOFFICE ONLYOFFICE 8.1版本桌面编辑器是…

【OC】巧用UIStackView简化布局

UIStackView的运用 文章目录 UIStackView的运用引入UIStackView的作用UIStackView的属性compression resistance 和 huggingaxisalignmentDistributionspacing UIStackView的方法UIStackView的示例 引入 在仿写ZARA的过程之中&#xff0c;我看到软件之中是有大量的按钮排列在一…

蓝卓创始人褚健:未来工厂需要一个“工业安卓”

作为国内自动控制的科学家&#xff0c;过去近三十年的时间&#xff0c;褚健教授一直服务于化工行业、炼油石化等流程工业领域。褚健表示&#xff0c;因为涉及到安全生产和环保要求&#xff0c;流程工业企业的自动化水平高一些&#xff0c;但总体来看&#xff0c;目前中国大部分…

【网络安全】SSRF 之 Azure Digital Twins Explorer

未经许可&#xff0c;不得转载。 文章目录 正文 正文 Azure Digital Twins 是一个微软下的平台服务&#xff0c;允许开发者创建和运行数字孪生模型&#xff0c;这些模型能够反映物理世界中的实体及其关系&#xff0c;通过这些模型可以进行监控、分析和预测等操作。 1、进入主…

昇思25天学习打卡营第17天|基于 MindSpore 实现 BERT 对话情绪识别

基于 MindSpore 实现 BERT 对话情绪识别 BERT介绍 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种基于Transformer架构的预训练语言模型&#xff0c;由谷歌在2018年提出。从以下6个方面来介绍BERT&#xff1a; 1. 预训练和微调&…

解决keil调试遇到的hardlfault问题

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

[AI 大模型] 阿里巴巴 通义千问

文章目录 [AI 大模型] 阿里巴巴 通义千问简介模型架构发展新技术和优势示例 [AI 大模型] 阿里巴巴 通义千问 简介 阿里巴巴的 通义千问 是由阿里云开发的一款大型语言模型&#xff0c;旨在为用户提供高效、智能的自然语言处理服务。 通义千问能够处理多种语言输入&#xff0c…

麒麟服务器操作系统2303SP3安装tigervnc

原文链接&#xff1a;麒麟服务器操作系统2303SP3安装tigervnc Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在麒麟服务器操作系统2303SP3上安装TigerVNC的文章。TigerVNC是一款高性能的远程桌面查看器&#xff0c;它支持多种操作系统&#xff0c;允许用户在远…

Oracle序列迁移重建

原因&#xff1a;oracle数据导入后序列不一致 解决办法&#xff1a;从原库中导出一份最新的序列号&#xff0c;在目标库中导入 1.删除目标库该用户下的所有索引 select DROP SEQUENCE ||sequence_name || ; from dba_sequences where sequence_owner xxxxx;2.查询出所有序列…

DepthAnything(2): 基于ONNXRuntime在ARM(aarch64)平台部署DepthAnything

DepthAnything(1): 先跑一跑Depth Anything_depth anything离线怎么跑-CSDN博客 目录 1. 写在前面 2. 安装推理组件 3. 生成ONNX 4. 准备ONNXRuntime库 5. API介绍 6. 例程 1. 写在前面 DepthAnything是一种能在任何情况下处理任何图像的简单却又强大的深度估计模型。 …

汽车预约维修小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;技师管理&#xff0c;技师信息管理&#xff0c;用户预约管理&#xff0c;取消预约管理&#xff0c;订单信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;技师信息&a…

揭秘焦虑症的“隐形杀手“:这些并发症可能悄悄来袭!

揭秘焦虑症的"隐形杀手"&#xff1a;这些并发症可能悄悄来袭&#xff01;在快节奏的现代生活中&#xff0c;焦虑症已经成为越来越多人面临的心理健康挑战。然而&#xff0c;除了广为人知的焦虑、紧张、失眠等症状外&#xff0c;焦虑症还可能引发一系列看似与焦虑无关…

每天五分钟计算机视觉:目标检测算法之R-CNN

本文重点 在计算机视觉领域,目标检测一直是一个核心问题,旨在识别图像中的物体并定位其位置。随着深度学习技术的发展,基于卷积神经网络(CNN)的目标检测算法取得了显著的进步。其中,R-CNN(Regions with CNN features)是一种开创性的目标检测框架,为后续的研究提供了重…

【高中数学/指数、对数】已知9^m=10,a=10^m-11,b=8^m-9,则ab两数和0的大小关系是?(2022年全国统考高考真题)

【问题】 已知9^m10,a10^m-11,b8^m-9,则&#xff08;&#xff09; A.a>0>b B.a>b>0 C.b>a>0 D.b>0>a 【解答】 首先注意到10^log10_11-110,8^log8_9-90&#xff0c; 问题就转化为log8_9,log9_10,log10_11谁大谁小的问题&#xff0c; 再进一步…

maven高级1——一个项目拆成多个

把原来一个项目&#xff0c;拆成多个项目。 &#xff01;&#xff01;他们之间&#xff0c;靠接口通信。 以ssm整合好的项目为例&#xff1a; 如何看拆的ok不ok 只要compile通过就ok。 拆分pojo 先新建一个项目模块&#xff0c;再把内容复制进去。 拆分dao 1.和上面一样…

可控学习综述:信息检索中的方法、应用和挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…