sqlite - 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 上的排序
解决方案
如果我使用 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 可以吗?
推荐阅读
- git - 我 git aborted rebase 并失去了我所有的工作
- excel - 为什么我会收到此编译错误:类型不匹配
- flutter - 无效值:有效值范围为空:0 Flutter
- reactjs - 将状态从一个组件传递到另一个组件
- excel - VBA Excel 宏另存为脑筋急转弯
- r - {assertr} 用于多变量条件限制
- arrays - Swift在方括号包装数组之后立即关闭做什么
- android - 为什么 bliss os 使用 qemu 会在启动时挂起?
- javascript - 我需要一个贝宝按钮来替换提交按钮。现在我两者都有,这很奇怪
- python - 使用 PIL 创建多级椭圆