Нужно ли заполнять таблицы SQLite FTS вручную? - PullRequest
0 голосов
/ 12 декабря 2018

Документация для SQLite FTS подразумевает , что таблицы FTS должны заполняться и обновляться с использованием INSERT, UPDATE, DELETE и т. Д.

Это то, что я делал - добавлял строки, удалял их,и т.д., но недавно я заметил, что как только я создаю таблицу FTS, она автоматически заполняется с использованием данных из источника.Я создаю его следующим образом:

CREATE VIRTUAL TABLE notes_fts USING fts4(content="notes", notindexed="id", id, title, body)

Если я добавлю строку в таблицу «заметок», она также автоматически добавится в notes_fts.Я предполагаю, что это виртуальные таблицы.

Но тогда, почему есть глава о заполнении таблиц FTS?В чем даже смысл, поскольку, например, если я удалю строку, она вернется, если она все еще находится в исходной таблице.

Есть идеи по этому поводу?Нужно ли заполнять FTS?

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

В соответствии с sqlite документом

Чтобы удалить запись, либо

-- Insert a row with rowid=14 into the fts5 table.
INSERT INTO ft(rowid, a, b, c) VALUES(14, $a, $b, $c);

-- Remove the same row from the fts5 table.
INSERT INTO ft(ft, rowid, a, b, c) VALUES('delete', 14, $a, $b, $c);

, либо

CREATE TRIGGER tbl_ad AFTER DELETE ON tbl BEGIN
  INSERT INTO fts_idx(fts_idx, rowid, b, c) VALUES('delete', old.a, old.b, old.c);
END;

Чтобы восстановить на основе измененного виртуальногостол

INSERT INTO ft(ft) VALUES('rebuild');
0 голосов
/ 13 декабря 2018

После дальнейшего чтения я обнаружил, что таблицу FTS действительно необходимо синхронизировать вручную с таблицей содержимого.При выполнении вызова CREATE VIRTUAL TABLE таблица FTS заполняется автоматически, но после этого удаления, вставки и обновления должны выполняться вручную.

В моем случае я сделал это с помощью следующих триггеров:

CREATE VIRTUAL TABLE notes_fts USING fts4(content="notes", notindexed="id", id, title, body

CREATE TRIGGER notes_fts_before_update BEFORE UPDATE ON notes BEGIN
    DELETE FROM notes_fts WHERE docid=old.rowid;
END

CREATE TRIGGER notes_fts_before_delete BEFORE DELETE ON notes BEGIN
    DELETE FROM notes_fts WHERE docid=old.rowid;
END

CREATE TRIGGER notes_after_update AFTER UPDATE ON notes BEGIN
    INSERT INTO notes_fts(docid, id, title, body) SELECT rowid, id, title, body FROM notes WHERE is_conflict = 0 AND encryption_applied = 0 AND new.rowid = notes.rowid;
END

CREATE TRIGGER notes_after_insert AFTER INSERT ON notes BEGIN
    INSERT INTO notes_fts(docid, id, title, body) SELECT rowid, id, title, body FROM notes WHERE is_conflict = 0 AND encryption_applied = 0 AND new.rowid = notes.rowid;
END;
...