先在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 '
数据库操作完毕后再来配置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 )
…………..//其他可以默认
}
source src1throttled : src1
{
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF
sql_ranged_throttle = 100
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
……
}
配置完成后,我在通过
/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
重新加载索引,执行成功后我们就可以来使用它了。
你可以往documents表中添加新的数据,然后执行命令:
SELECT doc.* FROM documents doc join sphinx on (doc.id=sphinx.id) where query='test'
你会发现你刚添加的数据没有被检索出来
然后执行:
SELECT doc.* FROM documents doc join sphinx1 on (doc.id=sphinx1.id) where query='test'
你会发现数据是空的,这时我们就需要来更新增量索引了。
通过执行:
/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='test'
你会发现新添加的数据被检索出来的。
主索引的更新:
/usr/local/sphinx/bin/indexer --rotate --config /usr/local/sphinx/etc/sphinx.conf test1 (我们可以设置成每天的午夜执行)
只有在更新了主索引后,
SELECT doc.* FROM documents doc join sphinx on (doc.id=sphinx.id) where query='test'
的结果才会被更新
我们也可以通过合并索引的方式使主索引的数据保持更新
通过执行
/usr/local/sphinx/bin/indexer --merge test1 test1stemmed --merge-dst-range deleted 0 0 --rotate
可以将增量索引test1stemmed合并到主索引test1中去
注意:在你测试的过程中,mysql的查询缓存可能会给你带来一些困惑,所以测试时最好将其关闭。
关闭方法:
set global query_cache_size = 0; //禁止缓存开销
你可以通过 SHOW VARIABLES LIKE '%query_cache% 来察看缓存状态
注:可以创建2个shell脚本,一个用来创建主索引、一个用来创建增量索引(此步可以省略)
{
1.创建主索引脚本build_main_index.sh