Mantener sincronizado un índice de búsqueda en SQL
El índice no debe ser una segunda copia de la verdad: apúntalo a la tabla y mantenlo al día.
CREATE VIRTUAL TABLE posts_fts USING fts5(
title,
body,
content = 'posts',
content_rowid = 'id'
);
CREATE TRIGGER posts_fts_insert
AFTER INSERT ON posts
BEGIN
INSERT INTO posts_fts (rowid, title, body)
VALUES (NEW.id, NEW.title, NEW.body);
END;
CREATE TRIGGER posts_fts_delete
AFTER DELETE ON posts
BEGIN
INSERT INTO posts_fts (posts_fts, rowid, title, body)
VALUES ('delete', OLD.id, OLD.title, OLD.body);
END;
Cómo funciona
content=hace de la tabla la fuente del contenido; el índice guarda solo términos.- Tres triggers lo mantienen al día: insert, delete, y update como delete más insert.
- Un borrado se escribe como el insert de la fila especial de comando
'delete'.
Palabras clave y builtins usados aquí
AFTERBEGINCREATEDELETEENDINSERTINTONEWOLDONTABLETRIGGERUSINGVALUES
El intento, en números
- Líneas
- 20
- Caracteres a escribir
- 413
- Tokens
- 94
- Ritmo de tres estrellas
- 95 tpm
Al ritmo de tres estrellas de 95 tokens por minuto, este intento toma unos 59 segundos.
Paso 4 de 4 en Búsqueda de texto completo; paso 12 de 14 en JSON y búsqueda.