android - 使用基于从普通表中选择语句的 FTS3/4 表

标签 android sqlite full-text-search

在我的应用程序中,我在 Android 中开发,我有一个名为 Transactions 的 Sqlite 表,其中包含以下字段:

_Id | Date | Value | Notes

我已经有一个 ListView 显示按日期过滤的结果(例如):

选择 * FROM Transacions WHERE Date BETWEEN '2016-04-25' AND '2016-05-14'

它工作正常,但我想实现一个 SearchView 来搜索字段 Notes 中自定义日期之间的交易,一些文本在 SearchView 中键入。 我阅读了有关添加 SearchView 的信息,实现搜索的最佳方法是使用 FTS3 或 FTS4 表,例如,允许用户键入“SUPERMARKET”并找到 Notes 包含此文本的交易。 问题的出现是因为 FTS 表执行 WHERE 条件的速度很慢(如上,过滤日期)...

如何使用 WHERE date BETWEEN ... and ... 过滤日期,并使用 FTS 表的性能过滤文本注释?

  • 如果不可能这样做,那么进行这样的查询是不是个好主意:

选择 * FROM Transacions WHERE (Date BETWEEN '2016-04-25' AND '2016-05-14) AND Notes LIKE '%text%''?

最佳答案

不要将 FTS 表视为表,而应将其视为索引。

像这样索引笔记:

CREATE VIRTUAL TABLE Transactions_FTS USING FTS4(Notes);

您必须确保两个表的 ID 匹配,然后可以像这样组合表:

SELECT *
FROM Transactions
WHERE Date BETWEEN '2016-04-25' AND '2016-05-14'
  AND _Id IN (SELECT docid
              FROM Transactions_FTS
              WHERE Notes MATCH 'supermarket');

或者这个:

SELECT *
FROM Transactions
JOIN Transactions_FTS ON Transactions._Id = Transactions_FTS.docid
WHERE Date BETWEEN '2016-04-25' AND '2016-05-14'
  AND Transactions_FTS.Notes MATCH 'supermarket';

(如果您关心使用的存储量,请考虑 external content FTS table。)

关于android - 使用基于从普通表中选择语句的 FTS3/4 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37472686/

相关文章:

java - Android Listview 文本颜色白色 onCreateView(而不是黑色)

java - 将数组传递给另一个类和 asynctask

android - xml vs. sqlite for android 以及如何

java - 用于查找两点之间路径的 SQL 查询

python - 如何删除或重置 Appengine 中的搜索索引

java - android:定期在任务或线程中拍照?

android - 我们如何在设备时间更改时刷新/.info/serverTimeOffset?

python - SQLalchemy 不区分大小写的排序顺序

mysql - 像 InnoDB 中的全文搜索

mysql - 如何在 MySQL AWS Aurora DB InnoDB 引擎中创建全文搜索索引