2017-06-14 6 views
0

Ich habe ein Problem mit Delta-Index-Updates.
Wenn die Dokument-ID kleiner als max_doc_id ist, ist sie nicht im Delta-Index enthalten. Solange der Hauptindex nicht aktualisiert wird, werden die Änderungen nicht auf diese Daten angewendet.
Angenommen, wir haben 1000 Daten.
Wenn das fünfzigste Dokument geändert wird, ändert sich der Delta-Index nicht.
Wie wird Delta-Index Dokumente Änderungen, die ihre ID ist weniger als max_doc_id?
Gibt es eine Möglichkeit, Delta-Index enthält die Daten aktualisiert werden, so dass wir nicht auf Main-Index-Lauf warten müssen?sphinxsearch Delta-Index-Updates

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

Antwort

0

Wenn Sie Dokumentaktualisierungen zusammen mit Einfügungen verfolgen möchten, sollten Sie eine separate Spalte für eine Dokumentversion haben. Revisionswerte sollten innerhalb der Dokumententabelle eindeutig sein. Daher ist es eine gute Idee, die globale Sequenz zu verwenden, um sie zu generieren.

Wenn Sie ein vorhandenes Dokument aktualisieren oder ein neues Dokument einfügen, sollten Sie den nächsten Wert aus der Revisionsfolge übernehmen und in der Spalte für die Dokumentversion speichern. Manchmal ist es eine gute Idee, DB-Trigger für automatische Revision Updates zu haben.

Dann in sql_query_pre Abschnitt können Sie min und max Revisionswerte in sph_counter Tabelle speichern und sie verwenden, um einen richtigen Delta-Index zu erstellen.

+0

Ich habe dich nicht verstanden? Wie auch immer, danke – navid

+0

Nun, es ist sehr ähnlich wie mit einem Zeitstempel, nur eine inkrementierende Sequenz explizit beibehalten. Jedes Mal, wenn Sie ein Dokument aktualisieren, aktualisieren Sie die Version. Gleiches Ergebnis - hätte eine Möglichkeit herauszufinden, welche Dokumente sich geändert haben. Beide würden funktionieren – barryhunter

1

Eine wirklich einfache Art, die ich mag, ist nur eine Zeitstempelspalte zu automatisch hinzuzufügen, um geänderte Dokumente zu verfolgen.

eine Spalte hinzufügen ...

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

Der Standardwert ist auch wichtig, damit es neu erstellte Dokumente sind auch enthalten.

Dann kann das nur in Abfragen verwenden, mit einer Kill-Liste. Der Hauptteil umfasst alle Dokumente zum Zeitpunkt der Indexierung. Das Delta enthält jedoch neue und geänderte Dokumente. Die Kill-Liste bedeutet die alte Version in Main, wird ignoriert.

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

(wie man die Abtötung Liste haben, Duplikate werden nicht Sache keinen Sinn die Haupt Filterung, nicht auch neve Notwendigkeit max_doc_id -.. So sph_counter zusammen mit dem sql_query_pre vereinfacht werden könnte in vielen Art und Weise es ist eine Schande Sie wiederholen müssen Die Abfrage in der Kill-Liste kann Sphinx nicht sagen, dass sie alle Dokumente im Index als Kill-Liste verwenden soll)