热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lucene初探之数据格式详情(五)

Lucene初探之数据格式详情(五)在前几篇文章中我们了解了索引文件中关于索引的正向信息和反向信息的存储格式。除了正向信息和反向信息之外,还有一种不可或缺的信息也保存在索引文件中–索引

Lucene初探之数据格式详情(五)

在前几篇文章中我们了解了索引文件中关于索引的正向信息和反向信息的存储格式。除了正向信息和反向信息之外,还有一种不可或缺的信息也保存在索引文件中–索引因子。

我们在开篇几张中介绍索引的搜索过程时,提到搜索引擎在将用户的查询关键词和倒序索引表进行比对,然后取出所有命中的文档之后,为了将最符合用户预期的文档展示在用户第一眼就看到的地方,需要对文档进行打分,计算文档和用户的query语句之间的相关性权重,权重越高的文档会越往前排序。在进行相关性权重打分计算的时候,我们使用的是向量空间模型对文档进行相关性打分,在计算相关性之前,需要先计算Term weight,这表示一个term相对其所对应的文档的重要性。

在计算Term weight时,主要有两个影响因素,一个是此Term在此文档中出现的次数,还有一个是此Term在所有文档中的出现频次,也就是普通程度。一个Term在文档中出现的次数越多,则其相对于此文档的重要性越高。

这种Term weight计算方式是最普通的计算方式,其存在以下几个问题:

  • 不同的文档重要性不同,有的文档重要一点,有的文档不是那么重要,比如对于一个软件相关的行业的用户,可能他想要和软件相关的文档排在前面一点,而和文学相关的文档排在后面一点;再比如对于一家旅游网站而言,搜索出来的信息应该都是和旅游相关的排在最前面,而其他一些无关紧要的其他行业的文档在搜索结果中排在后面一点。
  • 不同的域重要性不同,有的域重要一点,比如标题,关键词,tag标签等,而有的域则相关不是那么重要,或者说是无关紧要,比如附件等。同一个词,其出现在标题中绝对比出现在文末的结尾一句话中要重要得多。
  • 根据词在文档中出现的频次来进行Term weight打分,其中一个不合理的地方在于:篇幅长的文档相比篇幅短的文档而言计算词在文档中出现的次数时要占有优势。

由于以上的一些缺陷和一些其他的考量因素,Lucene在计算Term weight时会乘上一个标准因子来减少上面三个因素的影响。

标准化因子对打分计算有直接的影响,Lucene的打分计算的过程一部分是发生在索引的过程中,包括标准化因子,另一部分发生在搜索的过程中,后面我们会有详细的讲解。

标准化因子在索引的过程中总的计算如下:

其中:

  • Document boost:此值越大,说明此文档的重要性越高;
  • Field boost:此值越大,说明此域越重要;
  • lengthNorm(field) = 1.0/Math.sqrt(numTerms);一个域中包含的Term总数越多,也就是文档篇幅越长,此值越小;

从上面的公式中,我们可以知道,一个词在不同的文档和不同的域中的重要性不同。
比如有两个文档,每个文档两个域,忽略掉文档的长度的话,它们的组合有四种:重要文档的重要域,重要文档的非重要域……每种组合的标准化因子不同。

Lucene中的标准化因子一共保存了(DocumentNum * FieledNum)种,其格式如下:

  • 标准化因子文件:nrm
    -NormsHeader:字符串“NRM” 外加version;
    -NumField个Norms,一个域对应一项;
    -Norms本身是一个byte数组,个数为segment size,其每一个Byte表示一个浮点数;

推荐阅读
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • ES基本原理名词解释In-memorybuffer:ES内存缓冲区,新建的document写入的地方document:索引和搜索的 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 2022年7月20日:关键数据与市场动态分析
    2022年7月20日,本文对当日的关键数据和市场动态进行了深入分析。主要内容包括:1. 关键数据的解读与趋势分析;2. 市场动态的变化及其对投资策略的影响;3. 相关经济指标的评估。通过这些分析,帮助读者更好地理解当前市场环境,为决策提供参考。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 如何在PHP中获取数组中特定元素的索引位置
    在PHP中获取数组中特定元素的索引位置有多种方法。首先,可以使用 `array_search()` 函数,其语法为 `array_search(目标值, $array)`,该函数将返回匹配元素的第一个键名(即下标)。其次,也可以利用 `array_keys()` 函数,通过 `array_keys($array, 目标值)` 语法来获取所有匹配元素的键名列表。这两种方法都能有效解决数组元素定位的问题,具体选择取决于实际需求和性能考虑。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
author-avatar
Nicole-sasanh_880
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有