热门标签 | 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,具体的方案也很好实现,就不在这里多说了。


推荐阅读
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
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社区 版权所有