2017-06-14 78 views
0

我有一個Delta-index更新的問題。
如果文檔ID小於max_doc_id,則不包含在增量索引中,因此只要主索引未更新,更改將不會應用此數據。
假設我們有1000個數據。
如果更改了第50個文檔,則delta-index中不會有任何更改。
增量索引如何包含文檔更改,其編號小於max_doc_id
有沒有一種方式,增量指數包括數據更新,以便我們不必等待主指數運行?sphinxsearch增量指數更新

CREATE TABLE sph_counter 
(
    counter_id INTEGER PRIMARY KEY NOT NULL, 
    max_doc_id INTEGER NOT NULL 
); 
source main 
{ 
    # ... 
    sql_query_pre = SET NAMES utf8 
    sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents 
    sql_query = SELECT id, title, body FROM documents \ 
    WHERE id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) 
} 

source delta : main 
{ 
    sql_query_pre = SET NAMES utf8 
    sql_query = SELECT id, title, body FROM documents \ 
    WHERE id>(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) 
} 

回答

0

如果您想跟蹤文檔更新以及插入,您應該有一個單獨的文檔修訂列。修訂值在文檔表中應該是唯一的,因此使用全局序列來生成它們是一個好主意。

更新現有文檔或插入新文檔時,應從修訂序列中取下一個值並將其保存在文檔修訂列中。有時,爲自動修訂更新設置數據庫觸發器是個好主意。

然後在sql_query_pre部分,您可以將最小和最大修訂值保存到sph_counter表中,並使用它們來創建適當的增量索引。

+0

我不理解你? 無論如何,謝謝 – navid

+0

它與使用時間戳非常相似,只是明確地保持增量序列。每次更新文檔時,都會明確更新修訂版本。同樣的結果 - 可以找到哪些文件已經改變。要麼工作 – barryhunter

1

一個非常簡單的方法,我喜歡這個只是添加一個時間戳列自動跟蹤更改文件。

添加列...

ALTER TABLE documents 
    ADD updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    INDEX(updated); 

默認也很重要,所以新創建的文件包括

然後可以在查詢中使用它,並使用kill list。主要將包括索引時的所有文件。但三角洲將包括新的和變更的文件。殺死列表意味着舊的版本主要被忽略。

CREATE TABLE sph_counter 
(
    counter_id INTEGER PRIMARY KEY NOT NULL, 
    max_doc_id INTEGER NOT NULL, 
    indexing_time DATETIME NOT NULL 
); 
source main 
{ 
    # ... 
    sql_query_pre = SET NAMES utf8 
    sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id), NOW() FROM documents 
    sql_query = SELECT id, title, body FROM documents 
} 

source delta : main 
{ 
    sql_query_pre = SET NAMES utf8 

    sql_query = SELECT id, title, body FROM documents \ 
    WHERE updated > (SELECT indexing_time FROM sph_counter WHERE counter_id=1) 

    sql_query_killlist = SELECT id FROM documents \ 
    WHERE updated > (SELECT indexing_time FROM sph_counter WHERE counter_id=1) 
} 

(因爲有殺名單,沒點過濾爲主,重複不會事也不要尼夫需要max_doc_id - 。所以sph_counter可以與sql_query_pre一起被簡化,在許多方式它的一個恥辱,你必須重複在殺死列表中的查詢不能告訴獅身人面像使用索引中的所有文檔作爲殺人列表)