【问题标题】:Using FTS3/4 Table based on Select Statements from Normal Table使用基于从普通表中选择语句的 FTS3/4 表
【发布时间】:2016-09-25 03:45:06
【问题描述】:

在我的应用程序中,我在 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”并查找注释包含此文本的事务。 出现问题是因为 FTS 表执行 WHERE 条件(如上,过滤日期)很慢...

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

  • 如果不能这样做,最好有这样的查询:

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

【问题讨论】:

  • “这样的查询是个好主意吗”——这会非常慢。即兴发挥,join 或 sub-select 可能是最好的选择,虽然我还没有玩过这个场景。

标签: android sqlite full-text-search


【解决方案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。)

【讨论】:

  • 感谢您的回答!实际上,第二个选项似乎更适合我,但是我必须更改其他方法(更新、插入...)才能使用 fts 和普通表。为了不改变我的代码,我在 Activity 中动态创建了一个 fts,它在事务中过滤了数据,所以当用户开始搜索一些文本时,实际上它正在使用 fts 匹配,但是日期之间已经包含了值。 . 从其他表
猜你喜欢
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 2017-10-26
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
相关资源
最近更新 更多