需要调整我的 FTS4 SQLite 查询

Posted

技术标签:

【中文标题】需要调整我的 FTS4 SQLite 查询【英文标题】:Need to tweak my FTS4 SQLite query 【发布时间】:2013-05-02 00:05:28 【问题描述】:

以下查询在 android 上不起作用并引发以下异常

Unable to use function MATCH in the requested context

这是一个相当复杂的查询,所以我正在研究简化它的方法。有关信息,此查询在我的计算机上使用 sqlite-jdbc-3.715 驱动程序的同一数据库上工作

SELECT * FROM stop_times WHERE 
    departure_time  >= 1000-125
    AND 
    departure_time <= 1000+180 
    AND stop_id IN 
        (SELECT _id FROM stop_sequences WHERE stop_ids MATCH '"642," OR "642," OR ",642"')
    AND _id IN 
        (SELECT _id FROM trips WHERE service_id IN (SELECT _id FROM calendar WHERE wednesday=1))
ORDER BY departure_time ASC

我认为我的 FTS 表声明没问题:

CREATE VIRTUAL TABLE stop_sequences USING fts4(
    _id INTEGER PRIMARY KEY,
    stop_ids TEXT
);

SQL 大师能帮我吗?谢谢

编辑:我发现即使是最简单的查询,例如

SELECT _id FROM stop_sequences WHERE stop_ids MATCH '"642";

失败并出现同样的错误。我已经在我的代码中其他地方的另一个数据库上使用了MATCH 语句,它根本没有抱怨。错误消息中提到的上下文是否与Android的Context有关?

【问题讨论】:

我认为这会对性能造成不良影响,而且我的停止序列表非常大 sqlite 没有 MATCH 是的,我在我的应用程序的另一部分使用它 你是对的我的错误 你想看看这个链接mailinglistarchive.com/html/sqlite-users@sqlite.org/2010-03/… 【参考方案1】:

当您创建此表时,您指定了USING fts4(),对吗?否则,您的全文查询将根本不起作用。

【讨论】:

是的,我的 CREATE 在问题中。此外,当我使用 sqlite3 命令在我的 shell 中运行它时,此查询有效 好吧,我真的很愚蠢,我使用的是旧版本的数据库,但忘记使用 fts4 表更新到新版本。你的回答让我检查了,我应该接受吗? 别难过,@chopchop,我们有时都会遇到类似的问题。【参考方案2】:

您可以尝试使用 union 更改查询

SELECT * FROM stop_times WHERE 
    departure_time  >= 1000-125
    AND 
    departure_time <= 1000+180 
    AND stop_id IN 
        (SELECT _id FROM stop_sequences 
         WHERE stop_ids 
         MATCH '"642,"'
         UNION
         SELECT _id FROM stop_sequences 
         WHERE stop_ids 
         MATCH '",642"'
         )
    AND _id IN 
        (SELECT _id FROM trips WHERE service_id IN (SELECT _id FROM calendar WHERE wednesday=1))
ORDER BY departure_time ASC

【讨论】:

以上是关于需要调整我的 FTS4 SQLite 查询的主要内容,如果未能解决你的问题,请参考以下文章

带有 FTS4 表的 sqlite3:查询返回错误的行

没有这样的模块:fts4aux-查询使用 fts4aux 创建的 sqlite 虚拟表时出错

如何增加 Sqlite FTS4 片段大小

FTS4 SQLITE 中的外部内容

SQLite3 FTS4、MATCH 和 Android

ios sqlite fts 扩展“没有这样的模块 fts4”错误