【Golang系统开发】搜索引擎(2) 压缩词典

这篇具有很好参考价值的文章主要介绍了【Golang系统开发】搜索引擎(2) 压缩词典。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

这篇文章我们就给出一系列的数据结构,使得词典能达到越来越高的压缩比。当然,和倒排索引记录表的大小相比,词典只占据了非常小的空间。那么为什么要对词典进行压缩呢?

这是因为决定信息检索系统的查询响应时间的一个重要因素就是磁盘的访问次数,而如果有部分词典存在于磁盘上,那么在处理查询时就需要更多的磁盘访问次数。 因此,词典压缩的主要目的是可以将词典放在内存当中,这样才会获得很高的查询吞吐率。那么如何能将更多的词典压缩在有限的内存中呢?

1. 词典看成单一字符串

最简单的词典的数据结构就是整个词典采用定长数组来存储且所有词项按照词典序排序。假设对每个词项采用20B的固定长度存储,文档频率采用4B存储,词项到倒排索引也采用4B存储。这里的4B指针能够访问4GB的地址空间(4B–>32位–>2的32次方–>4GB)。

【Golang系统开发】搜索引擎(2) 压缩词典,从0到1写一个搜索引擎,搜索引擎
这样即使我们的词典有 四百万 个,我们所占的内存就只是 4,000,000 * (20+4+4) B = 112 MB,只是一百多兆而已,这非常的压缩。

但是很明显,采用这种定长方法来存储词典存在空间浪费。一个中文三个字节,很多情况下我们的词典只是两个中文,也就是六个字节,所以会有 14字节的浪费 。但是如果是一些特定的词语超过了20字节(比如中南财经政法大学),这里又存不下去。一种解决上述缺陷的方法是将所有的词项存成一个长字符串,并给每个词项增加一个定位指针,他在指向下一词项的同时也表示这当前词项的结束。 同以往一样,仍然可以通过二分查法定位到所需的词项,但是现在的表更小了。

由于每20B能够节省下12B,所以相当于前面的定长机制而言,这种机制能够在词项存储上节省大约60%的空间。当然,以上计算没有包括指向词项的指针所消耗的空间。所有的这些指针寻址的空间大小为 400000 ∗ 8 = 3.2 ∗ 1 0 6 400000 * 8 = 3.2 * 10^6 4000008=3.2106 ,因此一个指针 可以用 log ⁡ 2 ( 3.2 ) ∗ 1 0 2 \log_2(3.2)*10^2 log2(3.2)102 约等于 22 位 或者 3B来表示

【Golang系统开发】搜索引擎(2) 压缩词典,从0到1写一个搜索引擎,搜索引擎
将整个词条看成一个长字符串的词典存储方式,其中指向下一词项的指针同时也标志着当前词项的结束。

在这种方式下,词条就将所有上述的 4,000,000 * (20+4+4) B = 112 MB 压缩到了 4,000,000 * (3+4+4+8) B = 76 MB ,这个 8 指的是每个词项的平均长度。这种就从 112MB --> 76MB 大大降低了1/3

2. 按块存储

我们可以根据上一节的结果进行再一次的压缩:将长字符串中的词项进行分组变成大小为k的块,即k个词项一组,然后对每个块只保留第一个词项的指针。同时用一个额外字典将每个词项的长度存储在每个词项的首部。因此,每个块而已,可以减少k-1个词项指针,但是需要额外的kB来保存k个词项的首部。

【Golang系统开发】搜索引擎(2) 压缩词典,从0到1写一个搜索引擎,搜索引擎
因此,对每个块而言,可以减少k-1个词项指针,到那时需要额外的kB来保存k个词项的长度。对于k=4,词项指针的存储将会减少 (k-1) * 3 = 9B ,但是同时需要增加 k=4B 来存储词项的长度。因此在按块存储的方式下,没k=4个词项的方式下,每k=4个词项就会节省出5B,所以总共节省的空间位 400000 * 1/4 * 5 = 5 MB,也就再次减少了5MB,在 76MB 的基础上又少了 71MB。

显然,k越大,压缩率也就越高。但是,在压缩和词项查找速度之间必须要保持某种平衡。否则会导致查找速率偏慢。

除此之外,还有一种前端编码方式的压缩,也就是将上面多个词的公共部分提取出来,这样能减少很多的空间。,这里就不过多讲解了。文章来源地址https://www.toymoban.com/news/detail-654496.html

到了这里,关于【Golang系统开发】搜索引擎(2) 压缩词典的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Apache Solr搜索引擎开发框架

    为什么要学习搜索引擎开发框架 常见的搜索引擎框架: 1.Solr 2.ElasticSearch 搭建ELK环境(ElasticSearch+Logback+Kabana)实现日志系统的搭建 Solr是基于Apache Lucene构建的流行,快速,开源的企业搜索平台。 Solr具有高可靠性,可扩展性和容错性,可提供分布式索引,复制和负载均衡查询

    2024年02月05日
    浏览(42)
  • 搜索引擎系统简要分析

    目录 一、搜索引擎简单介绍 二、搜索引擎整体架构和工作过程 (一)整体分析 (二)爬虫系统 三个基本点 爬虫系统的工作流程 关键考虑因素和挑战 (三)索引系统 网页处理阶段 预处理阶段 反作弊分析阶段 索引生成阶段 索引拆分 索引构建 索引更新 (四)检索系统 查

    2024年02月04日
    浏览(43)
  • 搜索引擎系统———引擎模块(ssm三剑客项目)

    =@TOC 咋们如果用我们的小服务器去搞百度,搜狗那种引擎肯定是不行的,内属于全站搜索,我们这里做一个站内搜索。这个还是可以的,就类似于我们对网站里的资源进行搜索。 搜索引擎就像一个小蜜蜂每天不停的采摘蜂蜜,就是去 爬虫 各个网页,然后通过爬取之后建立

    2023年04月09日
    浏览(44)
  • C++开源搜索引擎xapian开发入门

    开源搜索引擎框架和产品有很多,例如elasticsearch,sphinx,xapian,lucence,typesense,MeiliSearch 等,分别用不同的语言实现,具有类似但不完全相同的功能。准确来说不属于通用的搜索引擎,而是属于一种基于索引的文字检索系统。 考虑到方便将这种检索系统通过代码开发的形式

    2024年02月12日
    浏览(41)
  • 分享个自己开发的夸克网盘资源搜索引擎

    https://www.cuppaso.com/ 框架使用了 spring boot 全家桶 2.7.1版本 mybatis plus 最新版本3.5.1 es搜索引擎 版本的话是 elasticsearch-7.17.4-windows-x86_64

    2024年02月12日
    浏览(49)
  • Web 开发与搜索引擎优化,你应该选择哪一个?

    💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网站】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 ** Web 开发是设计、开发和维护网站的数字过程。SEO, 搜索引擎优化 ,是一种

    2024年02月03日
    浏览(39)
  • Phind——一款面向开发人员的AI搜索引擎

    Phind是一款面向开发人员的AI搜索引擎,它由大语言模型(Large Language Model,LLM)驱动 。相比于传统的搜索引擎,Phind有以下优势:自然语言搜索、面向开发者、AI驱动、时间定制、无需注册、以及社区支持 。 Phind支持使用自然语言进行搜索,程序员可以用类似于和人类对话的

    2023年04月22日
    浏览(53)
  • 【数据结构课程设计】简单搜索引擎系统

    该程序使用python语言实现利用爬虫代码爬取网站链接信息,将网站中文词语通过结巴分词进行分割,并存储爬取的数据信息,利用结巴分词库处理输入框用户输入的词语,进行搜索,通过链接评价函数,优先显示评分较高的链接;设计简单的html页面,实现可视化搜索功能。

    2024年01月23日
    浏览(60)
  • 竞赛 python的搜索引擎系统设计与实现

    🔥 优质竞赛项目系列,今天要分享的是 🚩 python的搜索引擎系统设计与实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:5分 创新点:3分 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-s

    2024年04月14日
    浏览(46)
  • 基于java的搜索引擎系统设计与实现

    基于java的搜索引擎系统设计与实现 基于Java的搜索引擎系统设计与实现的研究背景和动机是构建一个高效、准确、安全的搜索引擎系统。随着互联网的普及,搜索引擎已经成为了人们获取信息的主要方式之一。但是,现有的搜索引擎系统还存在一些问题,比如搜索结果的准确

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包