Was mache ich?
Ich schreibe ein Dateikennzeichnungsprogramm in JavaScript mit Electron und ich möchte SQLite verwenden. Ich kann mir nicht vorstellen, wie ich die Suche nach Tags implementieren würde. Ich bin neu in SQL und SQLite, daher bin ich mir nicht sicher, ob dies überhaupt nur durch Abfragen möglich ist. Wie kann ich wie unten beschrieben vorgehen?Wie kann ich erweiterte Abfragen in SQLite durchführen, um nach Dateien nach Tags zu suchen?
Suche Details:
Ich habe in FTS3/4 aussah. Ich kann damit alles machen, was ich will, AUSSER der Wildcard-Suche, von der Optik her.
- Suche nach Dateien mit allen gegebenen Tags:
blue_sky AND green_grass
- Suche nach Dateien ohne bestimmte Tags:
NOT blue_sky AND NOT green_grass
- Suche nach Dateien mit einigen der gegebenen tags:
green_sky OR blue_sky
- suchen Sie nach Dateien mit Wildcards überall in einem Tag:
*sky AND *grass AND *bl*e*
- Kombinationen der oben:
blue_sky AND green*
/green_grass AND blue_sky OR green_sky
Tables:
Mai
CREATE TABLE files (
id INTEGER PRIMARY KEY,
name TEXT
);
CREATE TABLE tags (
id INTEGER PRIMARY KEY,
name TEXT
);
CREATE TABLE file_tags (
id INTEGER PRIMARY KEY,
file_id INTEGER,
tag_id INTEGER
);
Beispiele geändert werden:
INSERT INTO files (name) VALUES ('file_1.png');
INSERT INTO files (name) VALUES ('file_2.png');
INSERT INTO files (name) VALUES ('file_3.png');
INSERT INTO files (name) VALUES ('file_4.png');
INSERT INTO tags (name) VALUES ('blue_sky');
INSERT INTO tags (name) VALUES ('green_sky');
INSERT INTO tags (name) VALUES ('green_grass');
INSERT INTO tags (name) VALUES ('blue_grass');
INSERT INTO tags (name) VALUES ('greenish_blue_sky');
INSERT INTO file_tags (file_id, tag_id) VALUES(file1_id, blue_sky_id);
INSERT INTO file_tags (file_id, tag_id) VALUES(file1_id, green_grass_id);
INSERT INTO file_tags (file_id, tag_id) VALUES(file2_id, blue_sky_id);
INSERT INTO file_tags (file_id, tag_id) VALUES(file2_id, blue_grass_id);
INSERT INTO file_tags (file_id, tag_id) VALUES(file3_id, greenish_blue_sky_id);
INSERT INTO file_tags (file_id, tag_id) VALUES(file4_id, green_sky_id);
INSERT INTO file_tags (file_id, tag_id) VALUES(file4_id, blue_grass_id);
Abfrage: blue_sky and green_grass
Ergebnis: file_1
Abfrage: blue_sky or green_sky
Ergebnis: file_1, file_2, file_4
Abfrage: blue_sky and green_grass or blue_grass
Ergebnis: file_1, file_2
Abfrage: *ish*
Ergebnis: file_3
Abfrage: *bl*e*
Ergebnis: file_1, file_2, file_3, file_4
Abfrage: *sky and not blue_grass
Ergebnis: file_1, file3
Hinweis: Wenn SQLite nicht das richtige Werkzeug für den Job ist, ich bin offen für Vorschläge.
Wildcard-Suche kann mit 'LIKE' erreicht werden: https://www.tutorialspoint.com/sqlite/sqlite_like_clause.htm – juzraai
Ich bin mir über sqlLite nicht sicher, weil ich es nicht verwende. Ihr Datenbankdesign sieht gut aus. Es wird Ihnen ermöglichen, Ihre erklärten Ziele zu erreichen. Was ich als Aufmerksamkeits-Getter sehe, ist Ihre Absicht, Javascript zu verwenden. Es läuft auf Kunden. Datenbanken sitzen normalerweise auf Servern. Vielleicht löst Electron dieses Problem. Ich weiß nicht was es ist, also kann ich nicht sagen. –
@juzraai Ich habe 'LIKE' versucht, aber ich bin mir nicht sicher, wie ich eine Abfrage strukturieren soll, die den Rest meiner Bedingungen erfüllt. – Yuki