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

全文检索之sphinx源码分析优化(二)

    对上一篇的优化部分简要解释一下代码的变动,由于还是涉及一些工作上的业务,所以不会原模原样的写下来,不过解释一下逻辑则具体的代码实现也不会太难的    searchd    

        对上一篇的优化部分简要解释一下代码的变动,由于还是涉及一些工作上的业务,所以不会原模原样的写下来,不过解释一下逻辑则具体的代码实现也不会太难的

        searchd

        1、通过文件名排除不需要检索的索引文件,在RunSubset函数中通过对m_dQueries.m_dFilters.m_sAttrName.cstr()进行操作可以取得之前提到的where条件里的YYY的值范围,通过这个范围卡一下每一个m_dLocal中的索引文件的文件名代表的时间范围,对检索时间范围明确的查询有非常好的效果

        2、在RunLocalSearches函数里进行过滤,sphinx需要用户指定一个检索返回条数的值maxmatches,不指定就默认20条,我们以默认值举例:倒排一下索引文件m_dLocal.RSort(),于是最新的索引文件在最前面(索引文件名代表时间范围),此时假定第一个索引文件就检索够了20条,那么剩下的999个索引文件还需要检索么?答案是还是要看一下具体情况的,如果每个索引文件之间没有时间交集(如第一个索引文件维护17080102~17080103而第二个索引文件维护17080104~17080105)那么后面的999个索引文件的sph完全不需要解压看一下,反之如果有时间交集则还是要看一下有交集的索引文件的。这步优化对命中量大的关键字有非常好的效果,经常能将10分钟以上的检索时间减小到秒级

        3、n叉树的优化难度在于对这部分代码需要比较深入的去看,如果不用一些gdb这样的调试工具去追很难发现具体的点。在sphParseExtendedQuery函数生成第一个n叉树的时候,这部分只有match关键字相关的处理,我们可以在这里得知哪些节点是第一层的与操作的叶子节点,但是sph文件没有打开我们不能从其中得知哪些关键字命中为0,而如果我们推后到n叉转二叉的时候我们可以知道哪些关键字命中为0(通过sph文件)但是又没有办法判断哪些关键字是第一层的与操作子节点。因此我在XQNode_t类中加入一个新的变量need_to_check,在sphParseExtendedQuery函数生成n叉树的时候检查节点类型,将第一层的与操作的叶子节点的该值置为1,这样推后到转二叉树的时候ExtNode_i::Create函数中我们通过判断 if(pChild->need_to_check ==1 && pTerm->GetDocsCount() == 0)就可以直接返回NULL而不继续对这个索引文件进行检索了。

        indexer

        1、封装二进制文件读取数据实现伪流式处理逻辑,这里有两个思路,一个是类似xml文件生成索引的类,从CSphSource_Document类继承来,另一种是从CSphSource_SQL类继承,从CSphSource_Document类走则需要重新实现遍历doc的函数、遍历hit的函数,虽然从设计的角度来说是更为合理的,但是实现难度也更大,我在这里权衡了代码复杂度以后选择了从CSphSource_SQL类继承,这样虽然是利用的SQL类实现的文件流处理比较有违和感,但是实际上实现难度反而更小,代码改动加上测试基本在三五个小时就可以解决。需要实现的类函数主要是:

全文检索之sphinx源码分析--优化(二)

        具体实现就不一一列举了,从函数名也可以较容易的知道如何做,这里多说一下最好在disconnect函数里把建完索引的文件删掉以免内存盘撑爆。

        2、在创建索引时直接从文件夹里去看是否有需要建索引的文件,然后自己生成conf文件给自己用,而不是在调用参数里传conf文件把一切都固定死,同时给indexer各种模式参数可以保证在低数据量的情况下一次建立所以就退出和高数据量情况下积累一定的数据量在落地成索引文件。大数据量积累数据则需要在Build函数里循环source取数据这部分再在外部加上一个while,具体的方案也很好实现,就不在这里多说了。


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
author-avatar
贺扇面儿_263
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有