使用基于正常表中的选择语句的FTS3 / 4表

时间:2016-05-26 23:38:56

标签: android sqlite full-text-search

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

_Id | Date | Value | Notes

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

Select * 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表的性能过滤文本注释?

  • 如果无法这样做,最好有这样的查询:

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

1 个答案:

答案 0 :(得分:1)

不要将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。)