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

Lucene查询TopN的优化(一)

在索引阶段,我们可以在每一篇文档中添加一条或多条DocValues信息(正排),使得在查询阶段,当收集器Col

在索引阶段,我们可以在每一篇文档中添加一条或多条DocValues信息(正排),使得在查询阶段,当收集器Collector收集到满足查询条件的文档号后,可以根据文档号找到对应的正排信息,并依据正排信息对查询结果进行排序。

图1:

  图1中添加了3篇文档,红框标注即正排信息,我们在查询条件中设置一个排序规则:

图2:

  在图2的排序规则下,返回的结果为:

图3:


查询TopN的性能(优化前)

  基于目前Lucene的查询模块设计,整个查询过程可以按照获取迭代器收集器处理文档的这两个大的功能块进行划分。


获取迭代器

  获取迭代器描述的是从倒排信息中或者存储数值类型的BKD树中找到满足查询条件的文档号集合,该集合用于生一个迭代器。随后迭代器会按照文档号从小到大的顺序(在设置了段的排序IndexSort后,顺序可能会发生变化,见文章Collector(三)中的预备知识的介绍)依次取出每一个文档号,并将文档号送到收集器Collector中。

收集器处理文档

  收集器Collector会从迭代器中依次的获得有序的文档号,执行排序、过滤等操作。


问题

  上文介绍的查询模块设计会存在这个问题(为了便于介绍,我们暂时不考虑设置了段排序的情况):假设我们有10000篇文档号,排序方式为按照正排值升序,并且文档0中的正排值为0,文档1中的正排值为1,剩余的9998篇文档的正排值都大于1。如果我们只要Top2的结果,那么很明显,最好的期望的处理方式应该是收集器Collector在处理完文档0跟文档1后就不再处理剩余的其他文档了。然而在优化之前,由于依次传入到收集器Collector的文档号是从小到大是有序的,但是文档号对应的正排值是无法保证有序的,意味着收集器Collector只有处理完所有的文档号才能实现正确的Top2。在文章Collector(三)中详细介绍了优化前利用NumericDocValues获取TopN的过程,可以先行阅读下。


查询TopN的性能(优化后)

  在Lucene8.6.0后,当使用NumericDocValues实现TopN的查询时,可以跳过那些没有竞争力(uncompetitive)的文档集合,快速实现TopN的查询。我们先给出一个例子,比较下优化前后的性能差别,demo的地址:https://github.com/LuXugang/Lucene-7.5.0/blob/master/LuceneDemo8.9.0/src/main/java/index/NumericDocValuesTopNOptimization.java。

剩余内容看这里:https://www.amazingkoala.com.cn/Lucene/Search/2021/0621/193.html


推荐阅读
  • 可参照github代码:https:github.comrabbitmqrabbitmq-tutorialsblobmasterjavaEmitLogTopic.ja ... [详细]
  • SIoU Loss 的原理详解及代码实现分析
    本文详细解析了 SIoU Loss 的原理及其在边界框回归任务中的优势,并通过代码实现对其性能进行了深入分析。SIoU Loss 作为一种改进的损失函数,能够更有效地优化目标检测模型的边界框回归效果,提升模型的准确性和鲁棒性。文中还提供了具体的代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 解决针织难题:R语言编程技巧与常见错误分析 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 本文深入探讨了JLine库中的ConsoleReader.drawBuffer()方法的使用场景和具体实现,通过多个实际代码示例,帮助开发者更好地理解和应用此方法。 ... [详细]
  • 酷家乐 Serverless FaaS 产品实践探索
    本文探讨了酷家乐在 Serverless FaaS 领域的实践与经验,重点介绍了 FaaS 平台的构建、业务收益及未来发展方向。 ... [详细]
  • SQLite是一种轻量级的关系型数据库管理系统,尽管体积小巧,却能支持高达2TB的数据库容量,每个数据库以单个文件形式存储。本文将详细介绍SQLite在Android开发中的应用,包括其数据存储机制、事务处理方式及数据类型的动态特性。 ... [详细]
  • 本文介绍了如何使用Workman框架构建一个功能全面的即时通讯系统,该系统不仅支持一对一聊天、群组聊天,还集成了视频会议和实时音视频通话功能,同时提供了红包发送等附加功能。 ... [详细]
  • [编程题] LeetCode上的Dynamic Programming(动态规划)类型的题目
    继上次把backTracking的题目做了一下之后:backTracking,我把LeetCode的动态规划的题目又做了一下,还有几道比较难的Medium的题和Hard的题没做出来,后面会继续 ... [详细]
  • 构建高性能Feed流系统的设计指南
    随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
  • 本文基于《Core Java Volume 2》的内容,深入探讨了网络编程中通过POST方法提交表单数据的技术细节,包括GET与POST方法的区别、POST提交的具体步骤及常见问题处理。 ... [详细]
  • 本文介绍了在Shader中优化常见数学函数的方法,包括特化和近似计算,以提高渲染性能。这些方法适用于HDR格式和RGBE编码的优化。 ... [详细]
  • Flutter 屏幕适配解决方案与最佳实践
    Flutter 屏幕适配解决方案与最佳实践 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
author-avatar
大爱仅有的财产丶_468
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有