`

sphinx的配置和管理

 
阅读更多

Sphinx增量索引(转)

 

在实际应用中往往有这么一种情况,数据库数据很大,比如我们的歌曲表,如果我们每次都去更新整个表的索引,对系统得开销将非常大,显然这是不合适,这时我们会发现,每天我们需要更新的数据相比较而言较少,在这种情况下我们就需要使用“主索引+增量索引”的模式来实现实时更新的功能。

这个模式实现的基本原理是设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新增的数据建立增量索引。主索引的更新频率我们可以设置的长一些(可以设置在每天的午夜进行更新),而增量索引的更新频率,我们可以将时间设置的很短(几分钟左右),这样在用户搜索的时候,我们可以同时查询这两个索引的数据。

下面,我们通过一个简单的例子来描述一下怎样实现这种模式

以sphinx.conf中默认的数据为例:

1.先在mysql中插入一个计数表和两个索引表

  1. CREATE TABLE sph_counter(
  2. counter_id INTEGER PRIMARY KEY NOT NULL,
  3. max_doc_id INTEGER NOT NULL
  4. );

//主索引使用(确认之前是否已经建立过该表,如果已经建立,这里就不需要重新建了)

  1. CREATE TABLE `sphinx` (  
  2. `id` int(11) NOT NULL,  
  3. `weight` int(11) NOT NULL,  
  4. `query` varchar(255) NOT NULL,  
  5. `CATALOGID` INT NOT NULL,  
  6. `EDITUSERID` INT NOT NULL,  
  7. `HITS` INT NULL,  
  8. `ADDTIME` INT NOT NULL,   KEY
  9. `Query` (`Query`)
  10. ) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION=sphinx://localhost:3312/test1

//增量索引使用

  1. CREATE TABLE `sphinx1` (
  2. `id` int(11) NOT NULL,
  3. `weight` int(11) NOT NULL,
  4. `query` varchar(255) NOT NULL,
  5. `CATALOGID` INT NOT NULL,
  6. `EDITUSERID` INT NOT NULL,
  7. `HITS` INT NULL,
  8. `ADDTIME` INT NOT NULL, KEY
  9. `Query` (`Query`)
  10. )ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION=’sphinx://localhost:3312/ test1stemmed ‘

2.修改sphinx.conf

  1. source src1
  2. {
  3. sql_query_pre = SET NAMES utf8
  4. sql_query_pre = SET SESSION query_cache_type=OFF
  5. sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
  6. sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents /
  7. WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
  8. … //其他可以默认
  9. }
  10. // 注意:sql_query_pre的个数需和src1对应,否则可能搜索不出相应结果
  11. source src1throttled : src1
  12. {
  13. sql_ranged_throttle = 100
  14. sql_query_pre = SET NAMES utf8
  15. sql_query_pre = SET SESSION query_cache_type=OFF
  16. sql_query_pre =
  17.    sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents /
  18. WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
  19. }
  20. index test1 //主索引
  21. {
  22. source = src1
  23. }
  24. index test1stemmed : test1 //增量索引
  25. {
  26. source = src1throttled
  27. }

3.重建索引

  1. /usr/local/sphinx/bin/searchd –stop
  2. /usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf –all
  3. /usr/local/sphinx/bin/searchd –config /usr/local/sphinx/etc/sphinx.conf

插入测试数据

  1. INSERT INTO `test`.`documents` (
  2. `id` ,
  3. `group_id` ,
  4. `group_id2` ,
  5. `date_added` ,
  6. `title` ,
  7. `content`
  8. )
  9. VALUES (
  10. NULL , 311NOW( ) , 索引合并合并两个已有的索引比重新对所有数据做索引更有效率,而且有时候必须这样做(例如在“ 主索引+增量索引”分区模式中应合并主索引和增量索引,而不是简单地重新索引“主索引对应的数据)。因此indexer有这个选项。合并索引一般比重新索引快,但在大型索引上仍然不是一蹴而就。基本上,待合并的两个索引都会被读入内存一次,而合并后的内容需要写入磁盘一次。例如,合并100GB和1GB的两个索引将导致202GB的IO操作(但很可能还是比重新索引少)
  11. );

执行

  1. SELECT doc . *
  2. FROM documents doc
  3. JOIN sphinx ON ( doc.id = sphinx.id )
  4. WHERE query = 索引

你会发现你刚添加的数据没有被检索出来
然后执行:

  1. SELECT doc.* FROM documents doc join sphinx1 on (doc.id=sphinx1.id) where query=索引

你会发现数据是空的,这时我们就需要来更新增量索引了。

通过执行:

  1. /usr/local/sphinx/bin/indexer –rotate –config /usr/local/sphinx/etc/sphinx.conf test1stemmed

命令来更新增量索引(正式使用时,我们可以将该命令配置到系统计划任务中,每隔几分钟执行一次)
–rotate: 该参数可以使我们在不需要停止searchd的情况下,直接加载索引
执行完命令该命令后,我们再来查看一下增量索引的数据

  1. SELECT doc.* FROM documents doc join sphinx1 on (doc.id=sphinx1.id) where query=索引

你会发现新添加的数据被检索出来的。

主索引的更新:

  1. /usr/local/sphinx/bin/indexer –rotate –config /usr/local/sphinx/etc/sphinx.conf test1
  1. collected 997 docs, 1.4 MB
  2. sorted 0.3 Mhits, 100.0% done
  3. total 997 docs, 1430054 bytes
  4. total 1.428 sec, 1001459.38 bytes/sec, 698.19 docs/sec

(我们可以设置成每天的午夜执行)

只有在更新了主索引后,结果才会被更新

  1. SELECT doc.* FROM documents doc join sphinx on (doc.id=sphinx.id) where query=索引

我们也可以通过合并索引的方式使主索引的数据保持更新

  1. /usr/local/sphinx/bin/indexer –merge test1 test1stemmed –rotate

可以将增量索引test1stemmed合并到主索引test1中去

为创建2个shell脚本,一个用来创建主索引、一个用来创建增量索引(此步可以省略)

1.创建主索引脚本build_main_index.sh

  1. #!/bin/sh
  2. #/usr/local/sphinx/bin/searchd –stop
  3. /usr/local/sphinx/bin/indexer test1 –config /usr/local/sphinx/etc/sphinx.conf >> /var/log/sphinx/mainindexlog
  4. #/usr/local/sphinx/bin/searchd

2.创建增量索引脚本build_delta_index.sh

  1. #!/bin/sh
  2. #/usr/local/sphinx/bin/searchd –stop
  3. /usr/local/sphinx/bin/indexer test1stemmed –config /usr/local/sphinx/etc/sphinx.conf –rotate>> /var/log/sphinx/deltaindexlog
  4. /usr/local/sphinx/bin/indexer –merge test1 test1stemmed –config /usr/local/sphinx/etc/sphinx.conf –rotate >> /var/log/sphinx/deltaindexlog
  5. #/usr/local/sphinx/bin/searchd

每隔5分钟进行索引增量合并,每天2:30重建索引

  1. */5 * * * * /bin/sh /opt/shell/build_delta_index.sh > /dev/null 2>&1
  2. 30 2* * * /bin/sh /opt/shell/build_main_index.sh > /dev/null 2>&1

每周一至周六上早6点增量合并,同日重建索引

  1. 1 6 * * 1-6 /bin/sh /opt/shell/build_delta_index.sh > /dev/null 2>&1
  2. 1 6 * * 7 /bin/sh /opt/shell/build_main_index.sh > /dev/null 2>&1

参考:
http://www.coreseek.com/uploads/pdf/sphinx_doc_zhcn_0.9.pdf

分享到:
评论

相关推荐

    seraph:Sphinx 配置管理器

    六翼天使Seraph,Sphinx 配置管理器。 作为 RESTful Web 服务公开。

    perl-Sphinx-Config-Builder:狮身人面像

    该模块背后的动机是需要管理由单个 Sphinx searchd 实例处理的许多索引和相应的源。 管理具有许多索引和源的配置文件很快变得笨拙,并且需要程序化的解决方案。 我们利用了这样一个事实,即如果有 shebang 行可以...

    狮身人面像登录管理器扩展「Sphinx Logon Manager Extension」-crx插件

    预先配置的Sphinx CardMaker管理软件在管理员电脑上即装即用,但它也为各种规模和类型的安装提供了全功能的灵活性。 •不需要额外责任的管理员可以安装Sphinx CardMaker,并让其运行,为Sphinx登录管理器安装提供...

    moonshine_sphinx:安装和配置狮身人面像

    用上帝管理和监视搜索 添加capistrano挂钩以重新启动部署时搜索 (可选)添加cron作业以运行索引器 moonshine_sphinx需要: 月光至少修订版 think_sphinx已安装并配置 moonshine_god将作为插件安装 可以通过在...

    服务器全能环境UPUPW ANK 64位版.zip

    09、新增FTP配置面板被动模式端口范围和访问日志开关。  10、新增ionCube Loaders解密组件于PHP7.1  V1.1.4更新列表:  01、更新Apache到Apache2.4.29  02、更新Kangle到Kangle...

    bitvijays.github.io-sphinx:狮身人面像

    我们将介绍编程(Vi,git),系统管理(Bash配置文件,更新Debian Linux系统,添加/删除/修改用户/组,更改组/所有者/权限,挂载/卸载,Linux目录,运行级别和内核配置)。基础设施渗透测试系列: 该系列涵盖了...

    python项目基于语音识别的智能垃圾分类系统.zip

    该系统对于城市管理、环保教育和公共参与具有重要价值。它可以提升公众对垃圾分类的认识,减少错误分类带来的环境污染,并促进资源的循环利用。随着人工智能技术的不断进步,未来这个系统可能会集成更多先进的语音...

    redmine_didyoumean:Redmine插件,用于在用户要打开新问题时搜索可能的重复项

    (可选)通过导航到“管理”&gt;“插件”来配置插件,并在“您要输入的意思?”行中选择“配置”标签。 搜索引擎 默认情况下,插件使用SQL Engine,但是有可用的SphinxSearch Engine。 1.在切换到Think Sphinx之前,...

    高级java笔试题-puppet-example:puppet示例项目,在现实世界中运行,管理300多个虚拟机

    我花了约100小时学习这些服务器配置,反复试错,并编写成puppet脚本和bash shell脚本,故本项目只能保证正常运行和基本的性能与安全,没有涉及这些服务器的高级技巧。 功能范围 已实现的功能模块 compiler:编译工具...

    p3_docs:该存储库用于管理PATRIC静态内容,例如网站教程,CLI教程,用户指南和PATRIC eNews

    该存储库用于管理PATRIC静态内容,例如网站教程,CLI教程,用户指南和PATRIC eNews。 有关配置,请参见。 Nginx的 在遵循《 Sphinx / Nginx确保您的本地Nginx服务器正在运行。 sudo nginx 并输入您的密码。 除非您...

    爱站CMS V2.0

    支持配置sphinx搜索引擎后使用sphinx全文搜索功能,支持对搜索词进行分词。 7.【验证码】:优化首次进入页面可能出现的验证码不显示问题。 8.【添加水印】:优化上传图片先选择添加水印可能报错的问题。 9.【后台...

    modern-python-projects-course:现代Python项目课程资料和讲义

    管理Python版本和软件包,隔离项目之间的依赖关系以及安装全局软件包。 创建新项目时,首先使用cookiecutter。 管理Python项目-如何编写良好的需求文件,使用pip工具固定依赖项,使用Makefile管理任务以及使用...

    hackweek:SUSE Hack Week工具和数据

    黑客周刊 一种将黑客思想培养到项目中然后进行协作的工具。 它在周期间使用,在SUSE周中,SUSE工程师可以无限制地... 无需分别配置和启动它,所有事情都可以通过rake ts:regenerate 。 砍死它 由于我们的项目涉及开发

    documentation:AIMMS文档发布于https

    其余所有实际上是配置和支持文件夹和文件。 在本地构建HTML文档 要求: (运行python3 -m pip install sphinx ) (运行python3 -m pip install sphinx-aimms-theme ) (运行python3 -m pip install aimms-...

    japanese-law:日本法律的狮身人面像存储库

    中间目标是从内务和通信部发布的获取法律信息,将其格式化为 Sphinx 文档,并在 readthedocs 中发布。编译文件它发布在 GitHub Pages 上。目录结构除了Sphinx的基本配置外,还放置以下目录。 / bin:各种实用程序/ ...

    chef_boilerplate_php

    包管理器 作曲家 质量保证工具 phpcs、phpunit、phpmd、phpdepend、phpcpd、phploc、phpcb 要求 厨师:11.x+ Ruby:1.9+ 默认网址 应用 网址 狮身人面像 文档 属性 用法 如何在食谱中使用 include_recipe '...

    高性能MySQL(第3版).part2

    7.12.4如何配置和维护查询缓存316 7.12.5InnoDB和查询缓存319 7.12.6通用查询缓存优化320 7.12.7查询缓存的替代方案321 7.13总结321 …… 第8章优化服务器设置325 第9章操作系统和硬件优化377 第10章复制433...

    JAVA上百实例源码以及开源项目源代码

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

Global site tag (gtag.js) - Google Analytics