2017-01-24 43 views
0

如何在带有FTS5表的SQLite3数据库中搜索(价格)范围?如何用FTS5和MATCH查找记录?

这是一个非常简化的示例表:

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); 

下面的命令返回预期的两个记录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

FTS表将所有内容存储为文本;在FTS表中使用idprice列是没有意义的。

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话。