分享好友 最新资讯首页 最新资讯分类 切换频道
大数据最全【elasticsearch实战】从零开始设计全站搜索引擎(6),2024年最新真的醉了
2024-11-07 22:43

img img

大数据最全【elasticsearch实战】从零开始设计全站搜索引擎(6),2024年最新真的醉了

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导,让我们一起学习成长

  • 搜索服务:基础的关键词检索能力、权限控制、热词/联想词、搜索结果混排、查询第三方数据
  • 数据转换服务:读取的转换成满足es索引结构的json对象,再写入,通过写入es中。 在这里插入图片描述

该服务包括:搜索门户api、权限控制、搜索能力、搜索混排、搜索热词、联想关键词。

搜索混排

由于自主维护的数据和第三方数据源数据都存储在es中,因此可以直接使用评分进行合并,如下图所示。 在这里插入图片描述

注意

  1. 可以配置不同数据源的评分权重(或者评分算法)以便优先要展示的结果
  2. 需要记录不同数据源的偏移量和不同数据的查询结果,以便实现下次查询分页处理
  3. 查询ES和查询私有云数据使用协程并行操作,等待2个结果共同返回处理。

另外你的第三方数据源没有存储在es数据库中,不能直接给出文档评分的,可以考虑以下混排方案

方案原理优点缺点临时建索引做混排将来自不同数据源的数据在中创建一个临时索引,然后在该索引上进行搜索和排序。1. 利用强大的搜索功能。2. 支持复杂的查询和排序。1. 需要创建临时索引,可能影响性能。2. 需要处理索引的创建和删除。3. 可能需要处理数据源之间的数据差异。内存混排将来自不同数据源的数据加载到内存索引中,然后在内存索引上进行搜索和排序。1. 高性能,因为数据存储在内存中。2. 支持复杂的查询和排序。1. 内存占用较高。2. 需要处理内存索引的创建和维护。3. 可能需要处理数据源之间的数据差异。分词词频内存混排根据分词和词频对来自不同数据源的数据进行内存中的排序,然后返回排序后的结果。1. 实现相对简单。2. 内存占用相对较低。1. 只支持基于分词和词频的排序。2. 对于复杂的查询和排序需求,可能不够灵活。3. 可能需要处理数据源之间的数据差异。

翻页方案

由于要对2个数据源进行混排,要支持搜索跳页比较困难,因此在功能实现上目前只能支持上下翻页来实现

翻页计算公式

前端需要保存每一页es 和 api 两个数据源的偏移量:EsOffset 和 ApiOffset,可以使用对象数组保存 , 翻页计算公式如下

  • 当前页码计算公式
  • 上一页:将当前页码减1 , 获取上一页页面缓存的上一页 EsOffset 和 ApiOffset
  • 下一页, 获取下一页的EsOffset 和 ApiOffset

注意:查询到第一页时,可清空页面分页缓存数组对象,重新存储。

翻页举例说明
  1. 查询首页,假设没页显示20条数据

    • 请求参数:EsOffset = 0,ApiOffset=0, PageSize=20
    • 返回结果

前端需要需要页面需要保存当前第一页页面的 和 ,页面缓存数据

  1. 继续查询下一页

    • 请求参数
    • 返回结果
    • 前端继续缓存当前分页数据
  2. 查询上一页

  • 请求参数:当前页码减1
  • 返回结果:与第一页一致 如果是查询第一数据,清空缓存数组,重新缓存当前分页数据。

权限处理

搜索权限需要满足根据用户权限过滤部分无权限的文档,以下是召回前处理和召回后处理权限的方案对比。

方案实现优点缺点召回前过滤在查询时,根据用户的权限对文档进行过滤,只返回有权限查看的文档。1. 查询结果直接满足权限要求。2. 减少了无关文档的返回,提高了性能。1. 需要在查询时处理权限信息。2. 对于复杂的权限体系,实现可能较为复杂。召回后过滤先查询所有文档,然后根据用户的权限对查询结果进行过滤。1. 查询过程简单,不需要处理权限信息。2. 适用于简单的权限体系。1. 可能返回大量无关文档,影响性能。2. 需要在查询后处理权限信息,增加了实现复杂度。

根据我的需求和场景,对性能要求较高,我们使用召回前过滤。如果希望简化查询过程,页可以考虑使用召回后过滤。 下面是在文档的权限格式,包含文档有权限的用户ID和部门ID

 

我们在设计索引mapping时

 

查询权限过滤参数

 
搜索行为日志收集

需要满足用户搜索历史记录,首先需要收集用户搜索行为日志。

#mermaid-svg-RGDIHV3yG6IIeTHR {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-RGDIHV3yG6IIeTHR .error-icon{fill:#552222;}#mermaid-svg-RGDIHV3yG6IIeTHR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RGDIHV3yG6IIeTHR .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-RGDIHV3yG6IIeTHR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RGDIHV3yG6IIeTHR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RGDIHV3yG6IIeTHR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RGDIHV3yG6IIeTHR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RGDIHV3yG6IIeTHR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RGDIHV3yG6IIeTHR .marker.cross{stroke:#333333;}#mermaid-svg-RGDIHV3yG6IIeTHR svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RGDIHV3yG6IIeTHR .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-RGDIHV3yG6IIeTHR .cluster-label text{fill:#333;}#mermaid-svg-RGDIHV3yG6IIeTHR .cluster-label span{color:#333;}#mermaid-svg-RGDIHV3yG6IIeTHR .label text,#mermaid-svg-RGDIHV3yG6IIeTHR span{fill:#333;color:#333;}#mermaid-svg-RGDIHV3yG6IIeTHR .node rect,#mermaid-svg-RGDIHV3yG6IIeTHR .node circle,#mermaid-svg-RGDIHV3yG6IIeTHR .node ellipse,#mermaid-svg-RGDIHV3yG6IIeTHR .node polygon,#mermaid-svg-RGDIHV3yG6IIeTHR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RGDIHV3yG6IIeTHR .node .label{text-align:center;}#mermaid-svg-RGDIHV3yG6IIeTHR .node.clickable{cursor:pointer;}#mermaid-svg-RGDIHV3yG6IIeTHR .arrowheadPath{fill:#333333;}#mermaid-svg-RGDIHV3yG6IIeTHR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RGDIHV3yG6IIeTHR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RGDIHV3yG6IIeTHR .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-RGDIHV3yG6IIeTHR .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-RGDIHV3yG6IIeTHR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RGDIHV3yG6IIeTHR .cluster text{fill:#333;}#mermaid-svg-RGDIHV3yG6IIeTHR .cluster span{color:#333;}#mermaid-svg-RGDIHV3yG6IIeTHR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RGDIHV3yG6IIeTHR :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

输入关键词

写入日志

用户

服务端

Mysql

通过收集用户搜索关键词存储在MySQL,每日定时任务统计热词和联想词来实现热门搜索榜和搜索联想词。

搜索热词设计

通过收集用户搜索词来统计热搜词, 其中热搜词的热度通过统计搜词词频来统计,统计包括热度周期,T+n 天的搜词次数排序,可以设计一个热度公式。

  1. 初始热度权重: w (默认1
  2. 单位时间词频: c :(时间单位可以是 分钟、小时、天等,例如:以天为单位统计
  3. 统计时间段数:T(例如:连续统计30天关键词搜索频次
  4. 单位时间热度: w / T(每个单位时间热度权重
  5. 距离当前时间单位: n (例如计算最近30天,昨天的单位为:0) 一个词热度计算公式: hot = [(T - 0)* c0 + (T - 1) * c1 + (T-2) * c2 + … + (T-n) * cn] * (w / T) 我们以按天统计,统计30天为例,每天的访问词频从近到远为: c0, c1, c2, … cn ( n 从0到29), 热度默认权重:1,时间段 T = 30(最近30天) hot = [(30 - 0) * c0 + (30 -1) * c1 + (30-2)*c2 + … + (30 - 29) * c29] * 1 / 30 => (30 * c0 + 29 * c1 + 28 * c2 + …+ c29) / 30 化简后可以得到热度公式

h

o

t

=

i

=

0

n

=

29

(

T

i

)

c

i

w

/

T

hot= sum_{i=0}^{n=29} (T-i)*ci * w/T

hot=i=0∑n=29​(T−i)∗ci∗w/T 6. 每天定时任务统计用户搜索词,使用公式根据近30天的热度值,按从大到小排序top n; 7. 将top n 结果存储到中,方便后续人工干预。

思考:同义词合并逻辑,类似词的搜索建议合并成一个词条,避免相似词太多。

搜索联想词设计

搜索联想词,使用了es的数据类型, 提供了一个叫做 的功能,它是一个基于前缀的自动完成建议器,可以用来实现关键词联想。当你输入一个词的前缀时,它就可以提供一些可能的完成建议。

  1. 每日统计用户近3个月搜索词,排序前top n 个词
  2. 将top n 写入es。(n >= 1000)。

索引模版

全文搜索模版
 
联想词索引
 

数据源优化

  1. 文档质量优化

    • 清洗低质量文档
    • 去除重复文档
  2. 排序优先级配置:支持不同来源数据设置不同权重。

搜索体验持续优化

  1. 搜索词库完善,补充分词器搜索词库:可以通过热门搜索词表和日常维护
  2. 搜索词自动补全(completion类型
  3. 搜索词同义替换,输入错别字时能给出正确词的结果
  4. 搜索点击率统计,即搜索命中结果的点击统计

img img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导,让我们一起学习成长

数据源优化

  1. 文档质量优化

    • 清洗低质量文档
    • 去除重复文档
  2. 排序优先级配置:支持不同来源数据设置不同权重。

搜索体验持续优化

  1. 搜索词库完善,补充分词器搜索词库:可以通过热门搜索词表和日常维护
  2. 搜索词自动补全(completion类型
  3. 搜索词同义替换,输入错别字时能给出正确词的结果
  4. 搜索点击率统计,即搜索命中结果的点击统计

[外链图片转存中…(img-SYBH8i7z-1715753224486)] [外链图片转存中…(img-I28Ugin1-1715753224487)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

最新文章
Optimizing Website Keywords for Improved SEO Performance
Abstra: Optimizing website keywords is a crucial aspe of improving SEO performance. By strategically choosing and implem
org域名代表什么 org域名是什么网站
域名是网站的标识,一个简单易记的域名可以让访问者更容易记住您的网站。网站域名后缀有很多,比如常见的.org、.com、.net等国际
全方位解析热门话题:深入探讨用户最关心的热点问题与解决方案
随着人工智能技术的发展其在医疗领域的应用日益广泛。算法可以在短时间内分析大量病例数据,辅助医生实行精准诊断,升级治疗效果
【增长】机构:预计2024年Mini LED背光产品出货增长至1379万台;天钰:AMOLED驱动芯片将于2024年Q2量产;大尺寸LCD/OLED面板供需情况改善
1.机构:预计2024年Mini LED背光产品出货增长至1379万台2.天钰:AMOLED驱动芯片将于2024年Q2量产3.京东方终止云南OLED项目10亿元
2025年百度广告投放最新实战指南
在数字化营销日益重要的今天,百度广告投放已成为众多企业推广品牌、吸引潜在客户的重要手段。然而,随着市场竞争的加剧,如何高
SEO优化站长如何提高搜索排名
在当今竞争激烈的数字市场中,提升网站的搜索排名是每位站长的主要目标。通过有效的SEO策略,不仅可以提高网站的可见性,还能吸
企业在线竞争力提升——专业SEO推广服务助力突破
网站优化SEO推广服务,专注于帮助企业提升在线竞争力。通过专业技术和策略,优化网站排名,吸引潜在客户,助力企业拓展市场,实
全面解析宏碁暗影骑士软件:提升游戏性能的利器
在现代游戏环境中,电脑性能往往是决定玩家游戏体验的关键因素之一。对于游戏爱好者来说,拥有一款能够有效提升游戏性能的软件是
SEO优化推广软件,点击精灵(SEO流量软件)是否真有用?
各位亲爱的小伙伴们,今天小编要和大家一起聊聊关于SEO优化推广软件中的一员——点击精灵(SEO流量软件)。大家都知道,在如今激烈
SEO排名神器套装全面解析,轻松驾驭网站优化
全面解析SEO排名工具套装,涵盖关键词分析、网站结构优化、内容质量评估等功能,助您轻松提升网站排名,快速吸引更多流量。无论