问题标签 [fts4]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
391 浏览

sqlite - SQLite:FTS5 影子表中的外键引用数据

SQLite的全文搜索扩展(FTS3、FTS4、FTS5)创建影子表。例如,如果我创建 FTS5 表

这还将自动创建几个真实(非虚拟)表,test_content其中(显然)存储插入到原始虚拟表中的实际数据test

我知道 SQLite 作者建议这些影子表“不应由用户直接访问”。但是从文档中不清楚是否对这些表的行为没有任何保证,或者这个建议主要关注直接INSERTUPDATE在它们上的尝试。但是从这些表中读取有什么风险?

具体来说 - 我需要另一个(常规)表来获得虚拟 FTS5 表的FOREIGN KEY哪些引用:rowid

我在文档中找不到这方面的提示,但我自己的实验表明外键在这里不起作用——test即使它们是从表中引用的,我仍然可以从表中删除记录myTable。但是,如果我这样做

然后一切似乎都按需要工作 -test如果从myTable.

这是有效的,因为从直接检查来看,表的rowidtest始终等于表的id列值test_content。即使当我rowid手动指定时,也会INSERT INTO test (rowid, value) VALUES (424242, 'foobar');出现一个新行,其中test_content包含相应的内容和对应的id等于424242(即使表中没有先前的记录)。

所以基本上,我的问题是 - rowidFTS5 表和id相应<name>_content影子表之间的这种对应关系是否可以保证?或者这可能会在某些情况下或在未来的版本中中断?

0 投票
0 回答
496 浏览

sql - Kotlin androidx.room.fts4 文档看起来像是使用 Java 编写的!有没有人使用 Kotlin 实现了 fts4 实体?

我在我的应用程序中实施 fts4 时遇到了一些困难。我的目标是使用最新的 jetpack 组件(包括 Room 数据库)完全在 Kotlin 中构建应用程序。但是,当我查看fts4的文档时,这些示例是用 Java 编写的!

除了相关类的 android 文档和fts3/4 的 sqlite 文档之外,我还搜索了一些不同的教程。值得注意的是,这篇博文和这些幻灯片。到目前为止,我能够找到的所有教程都是用 Java 编写的,并且依赖于数据库迁移来构建 fts^(见下文)所需的虚拟表。尽管如此,我还没有拼凑出一个可行的解决方案。

这是我的代码的最新迭代:

实体:

FTS 实体:

房间数据库:

种子数据库工作者:

项目 DAO:

另外,如果您想知道,我确保将 % 查询注释更改为 *.

^(注意)这不是我有任何经验的事情,可能是我努力想出一个可行的解决方案的部分原因。我有点不清楚 Room 将在幕后做多少工作,以及在生成、填充、索引和一般管理 fts 方面我需要干预多少。以前我的解决方案使用了非 fts 搜索查询,除了查询本身之外不需要任何 SQL。我对 SQL 不是很熟悉,而且我真的不了解迁移如何工作的基础知识。是否可以先构建数据库,然后将其迁移到新版本,而无需先安装应用程序,然后在更新版本中迁移数据库?如果不是,并且需要迁移来创建虚拟 fts 表,你怎么可能发布一个准备好 fts 的新 android 应用程序?!我觉得我的知识存在一些巨大的漏洞,阻碍了我取得任何进展。任何好的建议或提出的解决方案将不胜感激!

0 投票
1 回答
1733 浏览

android - 如何在我的 DAO 中引用可搜索的 FTS4 表而不会出现编译器错误?

用于 android 的 android [FTS4 文档][1] 声明“此类将在数据库中有一个映射 SQLite FTS4 表”。我是否应该将其解释为只需添加注释即可生成映射 SQLite FTS4 表,还是意味着我需要提供某种映射表来将 FTS4 实体类“连接”到虚拟 FTS4 表?

我目前假设前者。如果这是正确的,那么我如何在实际中使用这个映射表呢?我认为,当你创建一个带有 FTS4 注释的实体时,它会生成一个普通表和一个映射表,这两者实际上都不是一个可以使用 MATCH 函数查询的虚拟 FTS4 表。那么映射表到底映射到什么?!在运行时(可能在数据库回调或迁移期间)实现的一些假设的虚拟 FTS4 外部内容表?在那种情况下,我应该如何在我的 DAO 中引用可搜索的 FTS4 表而不会出现编译器错误?

解决了:

结果证明前一种解释是正确的,并且生成的映射表包括全文搜索所需的虚拟表。我仍然认为文档可以更清楚地说明这一点,但最终真正的潜在问题是我的房间依赖不是最新的。哦!

0 投票
0 回答
30 浏览

fts4 - FTS4 索引电话号码

如何索引 (001)12-345-6789 类型的电话号码以允许用户按子号码搜索,例如 567,而不使用 - 符号?

0 投票
1 回答
1353 浏览

android - Room 报错:预打包的数据库对 FTS 表的架构无效

我正在开发一个字典应用程序,它使用 FTS 表提供搜索。定义来自一个预打包的数据库,它具有以下模式:(.schemaLinux 上 sqlite3 程序的输出)

我的实体定义如下所示:

在我看来,模式完全匹配,但 Room 有不同的意见:/
它在 logcat 中抛出此错误:

0 投票
0 回答
298 浏览

android - Sqlite 查询以匹配 FTS4 表 Android 中的多个单词

我正在尝试在 androidFTS4表中执行此查询,并且效果很好:

我需要匹配多个列中的多个单词,如下所示:

这不适用于android,但适用于任何DB浏览器。

我尝试了许多组合,如下所示,它们都可以在浏览器中工作,但不能在 android 中工作。

文档sqlite3没有为具有多个单词的多个列指定任何解决方案。

同样在这个问题中,查询在我的第一行代码中提到的当前android环境中工作。也许它在过去不起作用,但现在它起作用了。我的问题是关于 OR/AND 的多个值,如所述,不是多列。

有没有办法在Android中实现这个东西?

0 投票
1 回答
845 浏览

android - Room 2.1 SQLite FTS:在数据库中插入新的单个 FTS 对象

我一直在尝试使用 FTS 表的新 Android 的 Room 2.1 功能来启用搜索功能。

实体:

FTS 实体:

数据库:

道:

当我还在原始表中添加行时,我希望在 FTS 中添加每一行(ChatMessageEntity - 未显示)。从头开始重建 FTS 表时,它工作得很好(ftsRebuild()上图)。

但是,我希望单独添加每个输入。我已经尝试了很多东西(例如saveFtsMessage()上面显示的) - 添加没有 docId,尝试使用 rowId,...我什至尝试添加一个新对象ChatMessageEntity作为ChatMessageFts输入,但由于错误我没有设法编译它。

任何关于如何在 FTS 表中添加个人输入的建议都非常受欢迎!

0 投票
3 回答
1779 浏览

fts4 - OperationalError:没有这样的模块:fts4

嗨,我尝试运行模糊匹配器代码,并弹出以下错误:

有什么建议么?提前致谢

编辑:我已经尝试从网站下载 sqlite zip 并将其保存在 DLL 文件中,但它仍然无法正常工作。我必须以某种方式激活它吗?

我正在使用 Anaconda3 64 位。

谢谢

0 投票
0 回答
59 浏览

sqlite - SQLite FTS4 增强的查询语法行为(使用括号)

我无法真正理解 FTS4 括号的行为,并希望得到一些解释。

以下是查询的 3 个变体,据我了解,它们都应该提供相似的结果,而哪些不是:

有趣的是,使用 SQLite 版本 3.32.2(嵌入在 DB Browser 3.12 中),这 3 个变体实际上输出了相同的 12 个结果集(预期结果,顺便说一句)。

使用 FTS5(无论 SQLite 的版本),对于查询的每 3 个变体,我也确实得到了相同的 12 个结果集。

不幸的是,目前我需要坚持使用相当旧的 SQLite 版本。

关于为什么括号似乎在上述查询中没有发挥作用的任何提示?

谢谢

0 投票
1 回答
643 浏览

android - 如何使用 FTS4 在 SQLite Android 上修复错误“函数 rank() 的参数数量错误”?

我有两张桌子:

  • persons
  • persons_fts.

以下是表的定义:

我想对表进行查询进行全文搜索persons_fts,并根据相关性对结果进行排名。在查看了有关如何执行此操作的官方文档后,我以以下查询结束:

除了额外的连接之外,此查询与官方文档中概述的查询完全相同。但是,当我尝试执行它时出现错误:

从表中检索数据时出错:函数 rank() 的参数数量错误(代码 1 SQLITE_ERROR)

我究竟做错了什么?

请注意,我不能选择使用 FTS5。