前往顾页
以后地位: 主页 > 精通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

号令来更新增量索引(正式利用时,我们可以将该号令建设到体系打算任务中,每隔几分钟履行一次)
--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
 

顶一下
(1)
100%
踩一下
(0)
0%
------分开线----------------------------
标签(Tag):Linux Ubuntu 操纵体系 Unix Android fedora debian
------分开线----------------------------
颁发评论
请自发遵循互联网相关的政策法规,严禁公布色情、暴力、革命的谈吐。
评价:
神色:
考证码:点击我更换图片
猜你感兴趣