搭建自己的搜索引擎之一

news2024/11/16 18:00:29

一、前言

关于搜索引擎自己接触的还算是比较多的,先简单回忆一下以前做过的事情,以前工作没有什么文档沉淀下来很多事情几乎都快忘差不多了,挺遗憾的。

1、10几年前在东奇软件做企业网站时玩过Lucene,当时中文分词还很弱,很多词搜不出来,印象中当时好像是给中国银行做企业网站,然后我的技术被银行的人鄙视,不过银行技术部门的人虽然会做银行的信息系统,但用的是C或Dephi,还不会JSP根本不会做网站,哈哈。

2、在阿里接触过三套搜索引擎,做淘宝教育对接VSearch,做分类信息对接淘宝主搜,另外还请淘宝终搜团队给我们小组做技术架构分享,VSearch和终搜都是基于Lucene和Solr搭建的,做了一些扩展,提供框架支持全量和增量数据的导入,Vsearch是为当时淘宝垂直市场战略服务的,因为对接主搜周期特别长而且很多个性化需求都不能满足,而终搜是另外一个团队开发的一个竟品,终搜字面意思就是统一掉所有搜索,当时两个组打得挺厉害,然后主搜是基于C语言开发的,最初的架构应该是来源于Yahoo,一淘和淘宝列表页(这个印象中叫Hasper系统什么来着)搜索都是主搜搭建的。

3、在牛邦做股票软件时,新股数据的查询由ElasticSearch提供,我当时负责写Python爬虫到几个网站去爬新股数据并导入ElasticSearch,领导负责搭建ElasticSearch及提供服务接口。

4、在现在公司做牛奶业务时,曾经让一个同事搭建ES,主要是解决配送单变更日志查询,但后来该业务一直没有起色搭好后最终没有进行切换。

5、窗帘系统正在搭建ES去解决一些实际中碰到的问题,比如每天的库存价值报告快照,实时库存报告导出,各种报表、现在完全依赖于数据库,突发负载还是比较高,另外一些实时数据查询导出需求使用数据库很难满足。

二、MySQL VS ElasticSearch

用ES一般做法是把MySQL里存储的数据同步一份到ES,然后用ES来做海量数据的实时查询,解决模糊搜索仅是一个小特性。

1、关系数据库存储结构化业务数据,更多是为了满足业务流程而进行设计,如果太过于考虑满足查询进行设计,整个结构会比较混乱会有很多冗余,而ES天生就是为了解决查询的,可以把多张表数据合并成一个Schema(或者叫类型),这样就可以解决掉很多耗性能的多表关联查询。

2、MySQL用事务特性来保证不会产生脏数据,而ES对事务方面并无什么支持,所以一般还是要用MySQL来存储原始数据。

3、MySQL做海量数据查询需要做分库分表,但最终你的查询还是会落在某个库的某张表中,而ES是天生的分布式架构,数据进行分片存储,在查询时一个节点A收到请求会将其转发给它数据节点,其它数据节点在本机查询将结果ID返回节点A,然后由节点A对所有结果进行排序分页,然后再去各个数据节点根据ID查原始数据返回给用户。

4、即使是单片查询,ES Lucene的倒排索引也比MySQL的B+TREE快。

三、倒排索引

ES是一个基于Lucene搜索服务,它提供分布式多用户全文搜索引擎,而Lucene仅是一个全文搜索引擎工具包。

1、倒排索引是什么

倒排索引是全文检索里的概念,既然有倒排索引那肯定也有正排索引,不管正排倒排都是全文检索里的概念,MySQL数据库Innodb是B+TREE索引,和正排倒排没关系。

正排索引:通过检索全文,然后再找到词语,就是全文正排索引。

文档->单词1、单词2

单词1 出现的次数 ,单词1出现的位置;单词2出现次数,单词2出现的位置。

倒排索引:通过词语查找到全文,就是全文倒排索引

单词1--->文档1,文档2,文档3

单词2--->文档1,文档2

2、倒排索引生成例子

文章1内容:qingcai lives in Hangzhou,I live in Hangzhou too.

文章2内容:he once lived in Shangrao.

step1:取得关键字

英文单词比较简单直接空格分词,中文需要分词器,过滤掉无意义的词比如in、too等,过滤掉标点符号,然后统一大小写,还原lives和lived成live,这样通过查live可以把lives和lived一起查出来。

文章1关键词:[qingcai][live][hangzhou][i][live][hangzhou]

文章2关键词:[he][live][shangrao]

step2:建立倒索引

关键词是按字符顺序排列的,可以用二分搜索算法快速搜索关键词。

Lucene会将上面三列分别做为以下三个文件保存。

  • 词典文件(Term Dictionary)

  • 频率文件(frequencies)

  • 位置文件(positions)

Term Dictionary还保存了指向另外两个文件的指针,最后Lucene还会对索引进行压缩。

3、索引查询

假如查询单词"live",Lucene通过对词典文件Term Dictionary)进行二分查找,然后通过指针读出所有的文章号,最后返回结果数据,而词典文件一般非常小,整个查询过程非常快速高效。

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

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

相关文章

ant design Pro中 initialState的使用方法

前言: initialState可以实现全局数据共享 基本使用: 在 umi 的运行时配置 src/app.tsx 中添加运行时配置 getInitialState ,该配置是一个 async 的 function,示例如下: export async function getInitialState() {…

Crazy Excel:Excel中的泥石流

Crazy Excel又名:疯狂Excel。是一款PC端的Excel软件工具,该软件支持windows, mac os等主流操作系统。 正如其名,作者在设计之初就加入了一些疯狂的设计,目的是创作出更加好用有效的excel工具。 不管是专业还是小白,…

【校招VIP】产品逻辑考察之优先级

考点介绍: 如何定义需求的优先级是考察产品经理能力的方法之一。 定义产品需求的优先级是非常关键的,不然团队会不知道各项事务的轻重缓急,资源和精力都无法集中在最重要的目标上。 产品逻辑考察之优先级-相关题目及解析内容可点击文章末尾链…

TSINGSEE视频AI智能分析技术:水泥厂安全生产智能监管解决方案

一、方案背景 随着人工智能技术的快速发展以及视频监控系统在全国范围内的迅速推进,基于AI视频智能分析技术的智能视频监控与智慧监管系统,也已经成为当前行业的发展趋势。在工业制造与工业生产领域,工厂对设备的巡检管理、维护维修、资产管…

Spring Cloud Gateway快速入门(四)——gateway最最重要的功能!Gateway如何实现的服务匹配

文章目录 前言为什么要使用gateway进行服务的分配集中化的路由管理:动态路由的支持:请求过滤和处理:高性能和高可靠性: 1. 介绍2. 服务匹配的概念2.1 路由规则2.1.1 Predicate(断言)2.1.2 Filter&#xff0…

GC8837国产驱动芯片,可以替代TI的DRV8837C,具有 PWM(IN/IN)输入接口, 与行业标准器件兼容,并具有过温保护功能。

GC8837 是一款 12V 直流电机驱动芯片, 为摄像机、消费类产品、玩具和其他低压或 者电池供电的运动控制类应用提供了集成的 电机驱动解决方案。芯片一般用了驱动一个 直流电机或者使用两颗来驱动步进电机。可以工作在 0~12V 的电源电压 上,能提供高达 1.5…

OpenCV之油画特效

源码: # 读取图片 img cv2.imread("d:/img.jpg", 1) height, width, channels img.shape# 灰度图 gray_img cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 将图像分为8x8的多个小块,并统计小块每个像素的灰度值 # 划分灰度等级,例如…

手写实现简易Spring框架

该文章记录的是自己实现简易Spring框架的记录,简化了源码中的大量操作,没有实现三级缓存的机制。 其中将会对Component,ComponentScan,Scope,Autowired注解。BeanDefinition类以及ApplicationContext、BeanPostProcess…

C++中的 throw详解

在《C++异常处理》一节中,我们讲到了 C++ 异常处理的流程,具体为: 抛出(Throw)--> 检测(Try) --> 捕获(Catch) 异常必须显式地抛出,才能被检测和捕获到;如果没有显式的抛出,即使有异常也检测不到。在 C++ 中,我们使用 throw 关键字来显式地抛出异常,它的用…

【GAMES103】基于物理的计算机动画入门(1)前置的基础数学知识

GAMES103: 基于物理的计算机动画入门 链接:GAMES103 1. 坐标系的划分 在游戏引擎中分为右手和左手坐标系,区分的依据是什么? 上图可以看到如果是左手坐标系,那么所有的物体都在屏幕后面,意味着x,y&#x…

【Linux 之二】Ubuntu下开发环境的搭建(NFS \ SSH \ FTP \ Smba \ ...)

目前正在进行Linux相关项目的开发,而我的Linux开发是在Ubuntu(版本20.04)下进行的,为此需要搭建很多Linux相关的开发环境,方便工作的进行。这里主要是对各种开发环境的搭建做一个总结记录,方便后面查阅&…

彻底解决win11系统0x80070032

经过各种尝试,终于找到原因。第一个是电脑加密软件,第二个是需要的部分功能没有开启,第三个BIOS设置。个人觉得第三个不重要。 解决方法 笔记本型号 笔记本型号是Thinkpad T14 gen2。进入BIOS的按键是按住Enter键。 1、关闭山丽防水墙服务…

AI AIgents时代 - (四.) HuggingGPT MetaGPT

🟢 HuggingGPT HuggingGPT是一个多模型调用的 Agent 框架,利用 ChatGPT 作为任务规划器,根据每个模型的描述来选择 HuggingFace 平台上可用的模型,最后根据模型的执行结果生成总结性的响应。 这个项目目前已在 Github 上开源&am…

【暴力DP】CF1409 F

Problem - F - Codeforces 题意: 思路: 首先有个很明显的结论是:替换的字符一定是那两个字符之一 那么替换成哪个字符贡献更大不确定,因此考虑DP 因为有操作次数限制,直接把操作放进状态里 为了计算贡献&#xff…

Go语言高级特性解析与实践

1. 并发模型与goroutine Go语言以其强大的并发模型而闻名,它的核心机制是goroutine。goroutine是一种轻量级线程,由Go运行时负责调度。我们可以通过go关键字创建goroutine,而不需要像传统的线程编程那样关注底层的线程管理。 示例代码&…

Spring boot:解决@RequestBody失效问题:传入的实体类为NULL

1.问题描述 使用springboot写了一个controller类, 在使用postman测试用户注册功能的时候, 出现了传入实体类user,没有被读取的问题(即requestbody注解失效)。 2.解决方法 1.用户请求方式问题 在请求时&#xff0c…

ruoyi框架修改左侧菜单样式

菜单效果 ruoyi前端框架左侧的菜单很丑,我们需要修改一下样式,下面直接看效果。 修改代码 1、sidebar.scss .el-menu-item, .el-submenu__title {overflow: hidden !important;text-overflow: ellipsis !important;white-space: nowrap !important;//…

java框架-Springboot3-数据访问

整合SSM SpringSpringMVCMybatis 整合步骤 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

k8s master 是如何进行pod的调度的

Master 节点将 Pod 调度到指定的 Node 节点的原理 该工作由 kube-scheduler 来完成&#xff0c;整个调度过程通过执行一些列复杂的算法最终为每个 Pod 计算出一个最佳的目标 Node&#xff0c;该过程由 kube-scheduler 进程自动完成。常见的有轮询调度&#xff08;RR&#xff09…

用HTML、CSS和JavaScript制作的通用进制转换器

随着编程和计算机科学越来越受欢迎&#xff0c;我们经常需要进行进制转换。本文将介绍一个简洁、美观、适用于移动设备的进制转换工具&#xff0c;并详细讨论其实现。 目录 &#x1f30d; 用HTML、CSS和JavaScript制作的通用进制转换器 1.项目图片展示 2. 技术栈 3. 主要功…