Sphinx增量索引(转)
在实际应用中往往有这么一种情况,数据库数据很大,比如我们的歌曲表,如果我们每次都去更新整个表的索引,对系统得开销将非常大,显然这是不合适,这时我们会发现,每天我们需要更新的数据相比较而言较少,在这种情况下我们就需要使用“主索引+增量索引”的模式来实现实时更新的功能。
这个模式实现的基本原理是设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新增的数据建立增量索引。主索引的更新频率我们可以设置的长一些(可以设置在每天的午夜进行更新),而增量索引的更新频率,我们可以将时间设置的很短(几分钟左右),这样在用户搜索的时候,我们可以同时查询这两个索引的数据。
下面,我们通过一个简单的例子来描述一下怎样实现这种模式
以sphinx.conf中默认的数据为例:
1.先在mysql中插入一个计数表和两个索引表
- CREATE TABLE sph_counter(
- counter_id INTEGER PRIMARY KEY NOT NULL,
- max_doc_id INTEGER NOT NULL
- );
//主索引使用(确认之前是否已经建立过该表,如果已经建立,这里就不需要重新建了)
- CREATE TABLE `sphinx` (
- `id` int(11) NOT NULL,
- `weight` int(11) NOT NULL,
- `query` varchar(255) NOT NULL,
- `CATALOGID` INT NOT NULL,
- `EDITUSERID` INT NOT NULL,
- `HITS` INT NULL,
- `ADDTIME` INT NOT NULL, KEY
- `Query` (`Query`)
- ) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION=‘sphinx://localhost:3312/test1‘
//增量索引使用
- CREATE TABLE `sphinx1` (
- `id` int(11) NOT NULL,
- `weight` int(11) NOT NULL,
- `query` varchar(255) NOT NULL,
- `CATALOGID` INT NOT NULL,
- `EDITUSERID` INT NOT NULL,
- `HITS` INT NULL,
- `ADDTIME` INT NOT NULL, KEY
- `Query` (`Query`)
- )ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION=’sphinx://localhost:3312/ test1stemmed ‘
2.修改sphinx.conf
- source src1
- {
- sql_query_pre = SET NAMES utf8
- sql_query_pre = SET SESSION query_cache_type=OFF
- sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
- sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents /
- WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
- … //其他可以默认
- }
- // 注意:sql_query_pre的个数需和src1对应,否则可能搜索不出相应结果
- source src1throttled : src1
- {
- sql_ranged_throttle = 100
- sql_query_pre = SET NAMES utf8
- sql_query_pre = SET SESSION query_cache_type=OFF
- sql_query_pre =
- sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents /
- WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
- }
- index test1 //主索引
- {
- source = src1
- …
- }
- index test1stemmed : test1 //增量索引
- {
- source = src1throttled
- …
- }
3.重建索引
- /usr/local/sphinx/bin/searchd –stop
- /usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf –all
- /usr/local/sphinx/bin/searchd –config /usr/local/sphinx/etc/sphinx.conf
插入测试数据
- INSERT INTO `test`.`documents` (
- `id` ,
- `group_id` ,
- `group_id2` ,
- `date_added` ,
- `title` ,
- `content`
- )
- VALUES (
- NULL , ‘3‘, ‘11‘, NOW( ) , ‘索引合并‘, ‘合并两个已有的索引比重新对所有数据做索引更有效率,而且有时候必须这样做(例如在“ 主索引+增量索引”分区模式中应合并主索引和增量索引,而不是简单地重新索引“主索引对应的数据)。因此indexer有这个选项。合并索引一般比重新索引快,但在大型索引上仍然不是一蹴而就。基本上,待合并的两个索引都会被读入内存一次,而合并后的内容需要写入磁盘一次。例如,合并100GB和1GB的两个索引将导致202GB的IO操作(但很可能还是比重新索引少)‘
- );
执行
- SELECT doc . *
- FROM documents doc
- JOIN sphinx ON ( doc.id = sphinx.id )
- WHERE query = ‘索引‘
你会发现你刚添加的数据没有被检索出来
然后执行:
- SELECT doc.* FROM documents doc join sphinx1 on (doc.id=sphinx1.id) where query=‘索引‘
你会发现数据是空的,这时我们就需要来更新增量索引了。
通过执行:
- /usr/local/sphinx/bin/indexer –rotate –config /usr/local/sphinx/etc/sphinx.conf test1stemmed
命令来更新增量索引(正式使用时,我们可以将该命令配置到系统计划任务中,每隔几分钟执行一次)
–rotate: 该参数可以使我们在不需要停止searchd的情况下,直接加载索引
执行完命令该命令后,我们再来查看一下增量索引的数据
- SELECT doc.* FROM documents doc join sphinx1 on (doc.id=sphinx1.id) where query=‘索引‘
你会发现新添加的数据被检索出来的。
主索引的更新:
- /usr/local/sphinx/bin/indexer –rotate –config /usr/local/sphinx/etc/sphinx.conf test1
- collected 997 docs, 1.4 MB
- sorted 0.3 Mhits, 100.0% done
- total 997 docs, 1430054 bytes
- total 1.428 sec, 1001459.38 bytes/sec, 698.19 docs/sec
(我们可以设置成每天的午夜执行)
只有在更新了主索引后,结果才会被更新
- SELECT doc.* FROM documents doc join sphinx on (doc.id=sphinx.id) where query=‘索引‘
我们也可以通过合并索引的方式使主索引的数据保持更新
- /usr/local/sphinx/bin/indexer –merge test1 test1stemmed –rotate
可以将增量索引test1stemmed合并到主索引test1中去
为创建2个shell脚本,一个用来创建主索引、一个用来创建增量索引(此步可以省略)
1.创建主索引脚本build_main_index.sh
- #!/bin/sh
- #/usr/local/sphinx/bin/searchd –stop
- /usr/local/sphinx/bin/indexer test1 –config /usr/local/sphinx/etc/sphinx.conf >> /var/log/sphinx/mainindexlog
- #/usr/local/sphinx/bin/searchd
2.创建增量索引脚本build_delta_index.sh
- #!/bin/sh
- #/usr/local/sphinx/bin/searchd –stop
- /usr/local/sphinx/bin/indexer test1stemmed –config /usr/local/sphinx/etc/sphinx.conf –rotate>> /var/log/sphinx/deltaindexlog
- /usr/local/sphinx/bin/indexer –merge test1 test1stemmed –config /usr/local/sphinx/etc/sphinx.conf –rotate >> /var/log/sphinx/deltaindexlog
- #/usr/local/sphinx/bin/searchd
每隔5分钟进行索引增量合并,每天2:30重建索引
- */5 * * * * /bin/sh /opt/shell/build_delta_index.sh > /dev/null 2>&1
- 30 2* * * /bin/sh /opt/shell/build_main_index.sh > /dev/null 2>&1
每周一至周六上早6点增量合并,同日重建索引
- 1 6 * * 1-6 /bin/sh /opt/shell/build_delta_index.sh > /dev/null 2>&1
- 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
相关推荐
本资源提供了关于Sphinx配置的详细说明,帮助用户更好地理解和使用这个工具。 1. **Sphinx的基本概念** - Sphinx是一个基于Python的文档生成框架,它通过解析源文件(通常是`.rst`文件)来构建和渲染文档。 - ...
正确安装和配置Sphinx、CoreSeek以及相应的客户端库,能为开发者带来便捷的搜索体验。在Linux和Mac环境下,需注意系统依赖和版本兼容性,以确保扩展正常工作。遇到问题时,应逐一排查,确保所有组件都安装并配置正确...
通过安装和配置 Sphinx 插件,Discuz! 用户可以享受到以下优势: 1. **高速检索**:Sphinx 使用倒排索引技术,能够在极短的时间内完成大规模数据的搜索。 2. **模糊匹配**:支持部分关键词匹配、同义词扩展等,...
4. **优化性能**:调整Sphinx配置参数,优化查询性能,例如调整匹配模式、过滤规则等。 ### 六、故障排查与维护 1. **监控日志**:定期查看Sphinx的日志文件,排查错误和异常。 2. **索引诊断**:检查索引文件的...
8. **测试搜索**:编写一个简单的Python脚本或使用Sphinx提供的`search`命令行工具,输入中文查询进行测试,验证安装和配置是否正确。 在实际应用中,你还需要考虑如何优化索引性能,比如调整索引的字段类型、设置...
1. **安装与配置**:首先需要在MySQL服务器上正确安装ha_sphinx.dll,并在my.cnf配置文件中添加相应的配置项,以便MySQL能够识别和使用SphinxSE。 2. **创建Sphinx数据源**:在Sphinx服务器上配置索引,定义需要...
Sphinx是一款强大的全文搜索引擎软件,尤其在文档管理和网站构建中广泛应用。它以其高效、可扩展性和灵活性著称,被许多大型项目采纳为他们的基础搜索工具。Sphinx 2.2.10是该软件的一个稳定版本,适用于Linux操作...
启动和管理Sphinx服务,可以使用`searchd`和` indexer`这两个命令。 除了基本配置,Sphinx还提供了一些高级特性,如短语搜索、同义词、模糊搜索、权重控制等,可以根据需求灵活调整。为了提高搜索性能,可以使用...
3. **扩展性**:Sphinx允许使用各种插件(也称为扩展)来增加额外的功能,如mathjax用于数学公式展示,todo扩展用于管理待办事项,或是graphviz扩展用于绘制流程图和状态机。 4. **多格式输出**:Sphinx生成的文档...
**Seraph:Sphinx配置管理器** 在IT领域,配置管理是系统管理和运维中的关键环节,它涉及到对软件系统配置信息的存储、更新和版本控制。`Seraph`,一个以`Sphinx`为基础的配置管理器,为用户提供了一种高效、安全的...
根据性能和准确性调整Sphinx配置,如排序方式、同义词处理、停用词列表等。 总结,结合Linux、PHP和Sphinx,你可以构建一个高效、灵活的全文搜索系统,适合于各种Web应用的需求。这个实例展示了如何从MySQL数据库...
这些工具各有用途,例如indexer用于建立索引,searchd用于启动Sphinx的搜索守护进程,search用于执行搜索命令,spelldump用于处理拼写错误,indextool用于索引文件的管理。 在Sphinx的使用过程中,用户会遇到各种...
2. **创建 Sphinx 配置文件**:编写 Sphinx 配置文件以指定数据来源和索引设置。 3. **生成索引**:根据配置文件生成索引文件。 4. **启动 Sphinx 服务**:启动 Sphinx 服务,以便接收搜索请求。 5. **使用 Sphinx ...
然后,可以调用`query()`方法执行搜索查询,`buildExcerpts()`创建高亮摘要,`updateAttributes()`更新属性,以及`connect()`和`close()`管理连接。 4. **案例分析**: 在提供的文档`Sphinx全文索引.doc`中,很...
- **字典管理**:XDict可能是一款用于管理和查找技术词汇的工具,帮助开发者快速查阅和理解专业术语。 - **自定义词典**:用户可以创建自己的词典,包含特定领域的术语和解释,提高工作效率。 - **搜索功能**:...
安装完成后,你可以使用Sphinx提供的函数,如`sphinx_client`,`sphinx_init`,`sphinx_query`等,来进行索引管理、搜索查询以及结果处理。同时,别忘了配置Sphinx服务器,创建索引,并确保服务运行正常。在PHP中,...
Sphinx 是一个强大的全文搜索引擎,尤其适用于实时...Sphinx 提供了丰富的 API 和配置选项,可以帮助你构建出满足业务需求的定制化搜索解决方案。同时,coreseek 对中文的支持,使得在中文环境下使用 Sphinx 成为可能。
2. Sphinx的配置文件(如`searchd.conf`和`sphinx.conf`)是否正确设置了数据库连接参数和索引配置。 3. PHP代码中与Sphinx交互的部分是否有语法错误或逻辑问题。 4. 检查服务器资源,确保内存和CPU足够处理索引更新...
本项目“Laravel开发-sphinx-search-laravel”就是针对Laravel框架集成Sphinx Search的一个实现,主要涉及Laravel的Sphinx搜索容器绑定和配置。 首先,要理解Laravel的依赖注入和容器。Laravel的依赖注入容器是框架...
Sphinx 的设计目标是为应用程序提供实时、低延迟的搜索服务,这使得它在网站、内容管理系统和其他需要高性能搜索的应用场景中广泛应用。 CoreSeek 是一个基于 Sphinx 的中文全文搜索解决方案,它扩展了 Sphinx 对...