2017-06-14 3 views
0

デルタインデックスのアップデートに問題があります。
文書IDがmax_doc_idより小さい場合は、デルタ索引には含まれていないため、メイン索引が更新されない限り、このデータは適用されません。
1000個のデータがあるとします。
50番目のドキュメントが変更されても、デルタインデックスは変更されません。
delta-indexには、文書の変更IDがmax_doc_id未満のものはどのように含まれますか?
デルタインデックスには、メインインデックスの実行を待つ必要がなくなるようにデータが更新されるという方法がありますか?sphinxsearchデルタインデックスのアップデート

答えて

0

文書の更新と挿入を追跡する場合は、文書の改訂用に別の列が必要です。リビジョン値はドキュメントテーブル全体で一意である必要があります。グローバルシーケンスを使用してリビジョン値を生成することをお勧めします。

既存のドキュメントを更新するか、新しいドキュメントを挿入する場合は、リビジョンシーケンスから次の値を取得して、ドキュメントリビジョンの列に保存する必要があります。自動リビジョンの更新にDBトリガーを使用することをお勧めします。

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); 

デフォルトも重要であり、それは、新しくドキュメントを作成したもが含まれています。

次に、キルリストを使用してクエリで使用できます。主なものには、索引作成時のすべての文書が含まれます。しかし、デルタには新しい文書や変更された文書が含まれます。キルリストは、古いバージョンのを意味し、無視されます。

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と一緒に簡単にすることができ、多くの方法でその恥はあなたが繰り返す必要がありキルリストのクエリ。インデックス内のすべてのドキュメントをキルリストとして使用するようにスフィンクスに指示することはできません)

関連する問題