返回首页
当前位置: 主页 > 精通Office > Ubuntu教程 >

Sphinx增量索引实例代码

时间:2012-05-07 21:49来源:知行网www.zhixing123.cn 编辑:麦田守望者

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

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

下面,我们通过一个简单的例子来描述一下怎样实现这种模式(大家可以根据服务器环境百度一下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.}
25.index test1stemmed : test1 //增量索引
26.{
27.source = src1throttled
28....
29.}

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 , '3', '11', NOW( ) , '索引合并', '合 并两个已有的索引比重新对所有数据做索引更有效率,而且有时候必须这样做(例如在“ 主索引+增量索引”分区模式中应合并主索引和增量索引,而不是简单地重新索引“主索引对应的数据)。因此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

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

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
 

------分隔线----------------------------
标签(Tag):Ubuntu Linux Android 操作系统 Unix fedora debian
------分隔线----------------------------
推荐内容
猜你感兴趣
博聚网