如何在带有FTS5表的SQLite3数据库中搜索(价格)范围?
这是一个非常简化的示例表:
CREATE VIRTUAL TABLE fruits USING fts5 (id, name, price);
INSERT INTO fruits (id,name,price) VALUES (1, 'Apple with A', 5);
INSERT INTO fruits (id,name,price) VALUES (2, 'Pineapple with B', 10);
INSERT INTO fruits (id,name,price) VALUES (3, 'Cucumber with C', 20);
INSERT INTO fruits (id,name,price) VALUES (4, 'Melon with D', 25);
INSERT INTO fruits (id,name,price) VALUES (5, 'Kiwi with E', 30);
INSERT INTO fruits (id,name,price) VALUES (6, 'Cucumber with F', 35);
INSERT INTO fruits (id,name,price) VALUES (7, 'Cucumber with G', 40);
以下命令返回Cucumber的预期两条记录3和7:
SELECT * FROM fruits WHERE fruits MATCH 'name:Cucumber AND (price:20 OR price:40)';
如何搜索价格范围为20到40的黄瓜(包括上例中的记录6)?如果我试试
SELECT * FROM fruits WHERE fruits MATCH 'name:Cucumber AND (price: BETWEEN 20 AND 40)';
或
SELECT * FROM fruits WHERE fruits MATCH 'name:Cucumber AND (price: BETWEEN 19 AND 41)';
我根本没有得到任何结果(或错误信息)。是否无法在一个查询中使用MATCH和BETWEEN?
另外: 为什么命令
SELECT * FROM fruits WHERE fruits MATCH 'name:C';
只返回一条记录(id:3)而不是3,6和7,假设“黄瓜”中的C也会被找到,而不仅仅是'与C'中的C?
答案 0 :(得分:1)
FTS表将所有内容存储为文本;在FTS表中包含id
和price
列是没有意义的。
FTS表上唯一有效的查询是搜索单词(以及内部docid
的查找)。
您应该将FTS表视为表而不是索引。将其他数据保存在“真实”表中,并对该表执行任何其他查询:
SELECT *
FROM fruits
WHERE id IN (SELECT docid
FROM fruits_fts
WHERE fruits_fts MATCH 'Cucumber')
AND price BETWEEN 20 AND 40;
要搜索以C
开头的字词,您必须使用prefix search。