我在做什么?
我在使用Electron在JavaScript中编写文件标记程序,我想使用SQLite。尽管如此,我无法弄清楚如何实现通过标签进行搜索。我不熟悉SQL和SQLite,所以我不确定这完全可以通过查询来完成。我如何去搜索如下所述?如何在SQLite中进行高级查询以通过标签搜索文件?
检索详情:
我看了一下FTS3/4。除了通配符搜索外,我可以做任何我想要的东西。
- 搜索与所有指定标记的文件:
blue_sky AND green_grass
- 搜索文件而不给出标签:
NOT blue_sky AND NOT green_grass
- 搜索文件与一些给出标签:
green_sky OR blue_sky
- 使用通配符搜索文件在标签中:上述的
*sky AND *grass AND *bl*e*
- 组合:
blue_sky AND green*
/green_grass AND blue_sky OR green_sky
表:
可以改变
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
);
实例:
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);
查询:blue_sky and green_grass
结果:file_1
查询:blue_sky or green_sky
结果:file_1, file_2, file_4
查询:blue_sky and green_grass or blue_grass
结果:file_1, file_2
查询:*ish*
结果:file_3
查询:*bl*e*
结果:file_1, file_2, file_3, file_4
查询:*sky and not blue_grass
结果:file_1, file3
注意:如果SQLite是不是因为工作的工具,我很开放的建议。
通配符搜索可以通过使用'LIKE'来实现:https://www.tutorialspoint.com/sqlite/sqlite_like_clause.htm – juzraai
我不确定关于sqlLite,因为我不使用它。你的数据库设计很好。它将使您能够达到您的既定目标。我认为是一个注意吸气剂是你使用JavaScript的意图。它运行在客户端上。数据库通常位于服务器上。也许Electron解决了这个问题。我不知道这是什么,所以我不能说。 –
@juzraai我尝试过'LIKE',但我不确定如何使用它来构造一个查询,以满足我的其他条件。 – Yuki