全文检索之sphinx源码分析--检索流程

Sphinx查询时最关注的是match里面的几个关键字的查询方式,因此每个检索语句下发到每个索引文件中去的时候首先做的就是对关键字进行结构化构建,得到的第一棵树是n叉树,然后这颗n叉树会进行第二次重构,重构以后的就是一颗有序的二叉树,每个二叉树非叶子节点就是需要做的操作,而每个叶子结点都代表了一个关键字。

    上图sphParseExtendedQuery函数构建的一颗n叉树,代表了match(‘affrow_199 & (affrow_0 | affrow_99 | (affrow_1 & affrow_2)) & pokeman & cpt_20170615 ’)这样的一个查询关键字序列。此时的这棵树还不能进入真正的检索,sphinx会在创建ranker时通过sphCreateRanker函数很隐晦的调用ExtRanker_None_c初始化->ExtRanker_c初始化->ExtNode_i::Create,通过create函数创建一颗可操作的二叉树。

    上图就是转化后的二叉树,所有的ExtAnd与操作都排序过了,其中无命中的pokeman关键字在最前。这是通过dTerms.Sort ( ExtNodeTF_fn() )完成的对命中数进行升序排序,也就是保证最小的关键字先进行与操作。

    与操作

    spd文件中得到了具体的数据块以后,由于三元组排序可以得知每个关键字的DocId序列是各自有序的,因此每个二叉树的两个DocId序列只需要进行简单的match排序就行了,pCur0pCur1进行对比,哪个小就自行向后走一位,直到两者相同,则压入结果集然后同时向后走一位,时间复杂度O(m+n)。


    或操作

    和与操作类似,或操作也是match排序,如果不同则压入小的pCur然后该pCur向后走一位,如果相同则压入一个pCur然后两个都向后走一位。

    与非操作

    与非则是以第一个pCur为基准和第二个pCur进行match,如果有一样的则跳过一样的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Coreseek 全文检索服务器 2.0 (Sphinx 0.9.8)参考手册和源程序 手册內容: 文档版本:v0.9 目录 1. 简介 1.1. 什么是 Sphinx 1.2. Sphinx 的特性 1.3. 如何获得 Sphinx 1.4. 许可协议 1.5. 作者和贡献者 1.6. 开发历史 2. 安装 2.1. 支持的操作系统 2.2. 依赖的工具 2.3. 安装 Sphinx 2.4. 已知的问题和解决方法 2.5. Sphinx 快速入门教程 3. 建立索引 3.1. 数据源 3.2. 属性 3.3. 多值属性 ( MVA : multi-valued attributes) 3.4. 索引 3.5. 数据源的限制 3.6. 字符集 , 大小写转换 , 和转换表 3.7. SQL 数据源 (MySQL, PostgreSQL) 3.8. xmlpipe 数据源 3.9. xmlpipe2 数据源 3.10. 实时索引 更新 3.11. 索引合并 4. 搜索 4.1. 匹配模式 4.2. 布尔查询 4.3. 扩展查询 4.4. 权值计算 4.5. 排序模式 4.6. 结果分组(聚类) 4.7. 分布式搜索 4.8. searchd 日志格式 5. API 参考 5.1. 通用 API 方法 5.1.1. GetLastError 5.1.2. GetLastWarning 5.1.3. SetServer 5.1.4. SetRetries 5.1.5. SetArrayResult 5.2. 通用搜索设置 5.2.1. SetLimits 5.2.2. SetMaxQueryTime 5.3. 全文搜索设置 5.3.1. SetMatchMode 5.3.2. SetRankingMode 5.3.3. SetSortMode 5.3.4. SetWeights 5.3.5. SetFieldWeights 5.3.6. SetIndexWeights 5.4. 结果集过滤设置 5.4.1. SetIDRange 5.4.2. SetFilter 5.4.3. SetFilterRange 5.4.4. SetFilterFloatRange 5.4.5. SetGeoAnchor 5.5. GROUP BY 设置 5.5.1. SetGroupBy 5.5.2. SetGroupDistinct 5.6. 搜索 5.6.1. Query 5.6.2. AddQuery 5.6.3. RunQueries 5.6.4. ResetFilters 5.6.5. ResetGroupBy 5.7. 额外的方法 5.7.1. BuildExcerpts 5.7.2. UpdateAttributes 6. MySQL 存储引擎 (SphinxSE) 6.1. SphinxSE 概览 6.2. 安装 SphinxSE 6.2.1. 在 MySQL 5.0.x 上 编译 SphinxSE 6.2.2. 在 MySQL 5.1.x 上编译 SphinxSE 6.2.3. SphinxSE 安装测试 6.3. 使用 SphinxSE 7. 报告 bugs 8. sphinx.conf 选项参考 8.1. Data source 配置选项 8.1.1. type 8.1.2. sql_host 8.1.3. sql_port 8.1.4. sql_user 8.1.5. sql_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值