首页 > 解决方案 > SQLite:fts5 和排名,按日期排序

问题描述

我们在应用程序中使用 SQLite 和 FTS5。它运行良好并且速度非常快。但是,当我们的虚拟 fts 表变大时,我们遇到了问题。我们需要按日期按时间倒序对搜索结果进行排序,而不是按默认排名,并且限制为 100。在英语中,我们需要与搜索字符串匹配的 100 个最近的行。

CREATE VIRTUAL TABLE ft USING fts5(time_stamp, data);
INSERT INTO ft(time_stamp, data) VALUES('1', 'foo 1');
INSERT INTO ft(time_stamp, data) VALUES('2', 'foo 2');
INSERT INTO ft(time_stamp, data) VALUES('3', 'foo 3');
SELECT * FROM ft WHERE data MATCH ('foo*') ORDER BY Rank LIMIT 2;

上述查询的结果如下所示:

-----------------
|time_stamp|data
-----------------
|1         |foo 1
-----------------
|2         |foo 2
-----------------

您可以看到,所有条目的排名都是相同的,并且默认排序(在排名之后)是按日期。有没有办法使用 fts5 按反向日期排序并完全忽略排名?

我在下面的工作......但是一旦表格变大,就会对性能产生可怕的影响。

CREATE VIRTUAL TABLE ft USING fts5(time_stamp, data);
INSERT INTO ft(time_stamp, data) VALUES('1', 'foo 1');
INSERT INTO ft(time_stamp, data) VALUES('2', 'foo 2');
INSERT INTO ft(time_stamp, data) VALUES('3', 'foo 3');
SELECT * FROM ft WHERE data MATCH ('foo*') ORDER BY time_stamp DESC LIMIT 2;

上述查询的结果如下所示:

-----------------
|time_stamp|data
-----------------
|3         |foo 3
-----------------
|2         |foo 2
-----------------

这正是我们正在寻找的......但我们需要一种方法来实现它而不使用 time_stamp 上的排序

标签: sqlitefts5

解决方案


如果我使用 ROWID,我会得到想要的结果。

SELECT ROWID, time_stamp, data FROM ft WHERE data MATCH ('foo*') ORDER BY ROWID DESC LIMIT 2;
-----------------------
|rowid|time_stamp|data
-----------------------
|3    |3         |foo 3
-----------------------
|2    |2         |foo 2
-----------------------

使用 ROWID 可以吗?


推荐阅读