sphinx 增量索引实现实例
来源:互联网 发布:美国 二战 知乎 编辑:程序博客网 时间:2024/06/01 09:13
Sphinx(斯芬克司)
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索.
Sphinx的主要特性包括:
高速索引 (在新款CPU上,近10 MB/秒); 高速搜索 (2-4G的文本量中平均查询速度不到0.1秒); 高可用性 (单CPU上最大可支持100 GB的文本,100M文档); 提供良好的相关性排名 支持分布式搜索; 提供文档摘要生成; 提供从MySQL内部的插件式存储引擎上搜索 支持布尔,短语, 和近义词查询; 支持每个文档多个全文检索域(默认最大32个); 支持每个文档多属性; 支持断词; 支持单字节编码与UTF-8编码;
**
实例:
**
注:sphinx的增量索引其实是通过两个索引来实现的(主索引每天凌晨更新,增量索引每5分钟生成一次),网上有说可以通过索引merge合并成一个索引,但我试了试没有真的合并进去
sphinx 增量索引的设置 数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到。全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少。 例如。原来的数据有几百万条,而新增的只是几千条。这样就可以使用“主索引+增量索引”的模式来实现近乎实时更新的功能。
这 个模式实现的基本原理是设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新 增的数据建立增量索引。主索引的更新频率可以设置的长一些(例如设置在每天的午夜进行),而增量索引的更新频率,我们可以将时间设置的很短(几分钟左 右),这样在用户搜索的时候,我们可以同时查询这两个索引的数据。
使用“主索引+增量索引”方法有个简单的实现,在数据库中增加一个计数表,记录每次重新构建主索引时,被索引表的最后一个数据id,这样在增量索引时只需要索引这个id以后的数据即可,每次重新构建主索引时都更新这个表。
测试条件:以默认的sphinx.conf配置为例,数据库表的数据也以 example.sql为例。
1、创建相关表
创建主索引表 CREATE TABLE `sph_test1` ( `id` int(10) unsigned NOT NULL, `weight` int(11) NOT NULL, `query` varchar(3072) CHARACTER SET latin1 NOT NULL, `group_id` int(11) DEFAULT NULL, KEY `query` (`query`)) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION='sphinx://127.0.0.1:9312/test1'创建索引计数表 CREATE TABLE `sph_counter` ( `id` int(11) NOT NULL, `max_doc_id` int(11) NOT NULL, PRIMARY KEY (`id`))创建增量索引表 CREATE TABLE `sph_delta_test1` ( `id` int(10) unsigned NOT NULL, `weight` int(11) NOT NULL, `query` varchar(3072) NOT NULL, `group_id` int(11) DEFAULT NULL, KEY `query` (`query`(1024))) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION='sphinx://127.0.0.1:9312/delta_test1'
2、修改sphinx.conf
source src1{ type = mysql sql_host = localhost sql_user = yourusername sql_pass = yourpassword sql_db = test //你所用的数据库 sql_port = 3306 //所用端口,默认是3306 sql_query_pre = SET NAMES utf8 sql_query_pre = 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 ) }// 注意:delta_src 中的sql_query_pre的个数需和main_src 对应,否则可能搜索不出相应结果source delta_src1: src1{ sql_ranged_throttle = 100 sql_query_pre = SET NAMES utf8 sql_query_pre = SET SESSION query_cache_type=OFF 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 path = /usr/local/sphinx/var/data/test1 charset_type = utf-8 #这个是支持中文必须要设置的 chinese_dictionary =/usr/local/sphinx/etc/xdict #..........其它可以默认}index delta_test1: src1 //增量索引{ source = delta_src1 path = /usr/local/sphinx/var/data/delta_src1}
3、定时任务生成索引(–rotate 参数可以不重启服务索引就能生效)
a、每天凌晨生成全量索引:./indexer test1 –rotate
b、每10分钟生成一次增量索引 :./indexer delta_test1 –rotate
- sphinx 增量索引实现实例
- sphinx 增量索引实现实例
- sphinx 增量索引 实现近实时更新
- sphinx 增量索引 实现近实时更新
- sphinx 增量索引 实现近实时更新
- sphinx 增量索引 实现近实时更新
- sphinx 增量索引 实现定时更新
- sphinx 增量索引 实现近实时更新
- sphinx 增量索引 实现实时更新
- sphinx 增量索引 实现近实时更新
- sphinx 增量索引 实现定时更新
- sphinx 增量索引 实现近实时更新
- sphinx 增量索引 实现近实时更新
- sphinx 增量索引 实现近实时
- Sphinx实时索引,用增量索引实现索引更新
- Sphinx增量索引(转)
- sphinx 增量索引更新
- sphinx 增量索引更新
- 仿Android5.0 Heads-Up风格的Toast提示
- IO流加强(总结)--IO流总结和练习
- 由于出现以下异常,无法生成模型:“System.Data.StrongTypingException: 表“TableDetails”中列“IsPrimaryKey”的值为 DBNull
- A. (网预)Saber's Conjecture 第十一届北京邮电大学程序设计竞赛
- 数据结构—树和二叉树-二叉树的递归遍历(DFS)
- sphinx 增量索引实现实例
- 计蒜客模拟赛5-礼物盒
- oj刷题—Problem D: C++习题-快速排序
- 直通BAT算法面试——排列组合、概率
- 如何实现1080P延迟低于500ms的实时超清直播传输技术
- anaconda指定国内源解决下载速度慢的问题
- 常用的二叉树操作
- 排序算法总结
- Caused by: org.xml.sax.SAXParseException: 不允许有匹配 "[xX][mM][lL]" 的处理指令目标。