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

    以下的优化措施都是基于我当前的项目做得,目的是为了提升系统效率和减少资源消耗,系统不同需求不同,所以只能是仅供参考。

Indexer优化

    1、减少数据库压力,修改从数据库中取数据为从文本中取数据,需要在编译的时候加入xml选项并且安装libexpat。但是通过测试实在不推荐这种用法,因为libexpat这东西十分脆弱,必须对xml输入的数据进行遍历清洗,同时如果xml的数据里也有xml类似的格式很可能解析崩溃。因此建议自己封装二进制文件来做,代码下期再更好了。这里说一下需要重点关注的点:首先是索引数据不入库直接发送给sphinx,这会造成数据的冗余,也就是说原来就是一份数据入库后再建索引,而现在是两份数据一份入库一份写文件给sphinx,但是也带来了一个好处就是索引和入库同时完成,为了保证sphinx建索引不对系统造成过大压力我们选择将索引的文件放到内存盘里,同时改写sphinx让它在处理完一个文件后再disconnect函数里把这个文件删掉以免文件夹写满了。

    2、采取xml模式的时候可以修改indexer原来的popen执行xmlcmd来取数据,改为xmlcmd只有文件名,然后用open(不是fopen)来读取数据,最后可以将时间减少为原来的1/3~1/4,这里看来direct的IO减少了buf调用还是效率更高的。

    3、调整分词符号,默认的由于ngram_chars和charset_table字段的配置进行了映射和转换,sphinx只识别下划线_作为有效符号,其他的所有符号都视为空格做切分用,粗略的讲ngram_chars标识所有indexer可以识别的utf8号,而charset_table做映射,可以将ASCII256个符号重新映射(也就是可以强制indexer将字符识别成别的字符,例如所有A识别成X,因此这里可以配置不被转换成空格的符号,当然仅限ASCII),所以如果对ascII分词符有需求的可以在ngram_chars里进行设置

Searchd优化

    1、sphinx可以方便的指定创建的索引文件的文件名,我们利用了这个点,将每个索引文件维护的数据的获取时间范围最小和最大的capture_time记录到了索引文件名上,此时由于索引文件名就是时间范围,因此入库和查询语句中我们指定了这个capture_time作为id,利用这个id进行索引文件的不查询:

    具体来说我们在建索引的时候指定id字段为capture_time的值,在检索的时候我们可以指定(XXX-id) as YYY,然后在where条件里指定YYY>time1 and YYY<time2,修改代码在RunSubset()函数里就可以取得这个filter条件,现在我们有了每个索引文件名(可以认为是这个索引文件维护的数据范围)和filter条件,如果这个filter条件是准确的那么我们遍历每个索引文件,不在这个filter范围的从local的容器里弹出去就好了。

    2、同时由于文件名是时间范围,因此可以进行优化,在runlocalsearch函数对所有的索引文件进行文件名也就是时间倒排,然后逐个查询,如果查到某个索引文件可以得到10000条记录,此时会记录查过的所有索引文件的时间范围,然后向后查询时就只查该时间范围有交集的索引文件了。

    3、前台需要保证按天切片进行查询并缓存结果,实时向用户显示。

    4、对所有的n叉树中的第一层与操作进行检查,如果任何一个与操作的子关键字没有命中,则不查了,这部分代码优化其实面对的应用场景是用户下了多个关键字进行查询同时其中有一个或几个实际上命中很少的,不做优化则sphinx会从索引文件中直接取所有的关键字然后遍历、取交际,然后返回一个空集,这个空集消耗的时间甚至可能比有命中的返回结果集消耗时间都长,十分反人类。

    5、由于IO争抢的问题,searchd同一台机器上的的并行效果很差,因此不建议在同一台机器上开多个searchd进行这种级别的并行,可以直接在远程的机器上开端口布上分布式的索引服务。

  • 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、付费专栏及课程。

余额充值