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=utf8CONNECTION='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
 
#Linux
相關文章
相關標籤/搜索