Sqlite 如何查找FTS5和MATCH之间的记录?

Sqlite 如何查找FTS5和MATCH之间的记录?,sqlite,fts5,Sqlite,Fts5,如何在具有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 INT

如何在具有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);
以下命令返回cumber的预期两条记录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)';

我没有得到任何结果(或错误消息)。不能在一个查询中使用MATCH和BETWEEN吗


此外: 为什么命令

SELECT * FROM fruits WHERE fruits MATCH 'name:C';

只返回一条记录(id:3),而不是3、6和7,假设“Cucumber”中的C也会被找到,那么不仅“with C”中的C会将所有内容存储为文本;在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
开头的单词,必须使用

SELECT *
FROM fruits
WHERE id IN (SELECT docid
             FROM fruits_fts
             WHERE fruits_fts MATCH 'Cucumber')
  AND price BETWEEN 20 AND 40;