问题标签 [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.
sqlite - SQLite:FTS5 影子表中的外键引用数据
SQLite的全文搜索扩展(FTS3、FTS4、FTS5)创建影子表。例如,如果我创建 FTS5 表
这还将自动创建几个真实(非虚拟)表,test_content
其中(显然)存储插入到原始虚拟表中的实际数据test
。
我知道 SQLite 作者建议这些影子表“不应由用户直接访问”。但是从文档中不清楚是否对这些表的行为没有任何保证,或者这个建议主要关注直接INSERT
或UPDATE
在它们上的尝试。但是从这些表中读取有什么风险?
具体来说 - 我需要另一个(常规)表来获得虚拟 FTS5 表的FOREIGN KEY
哪些引用:rowid
我在文档中找不到这方面的提示,但我自己的实验表明外键在这里不起作用——test
即使它们是从表中引用的,我仍然可以从表中删除记录myTable
。但是,如果我这样做
然后一切似乎都按需要工作 -test
如果从myTable
.
这是有效的,因为从直接检查来看,表的rowid
值test
始终等于表的id
列值test_content
。即使当我rowid
手动指定时,也会INSERT INTO test (rowid, value) VALUES (424242, 'foobar');
出现一个新行,其中test_content
包含相应的内容和对应的id
等于424242
(即使表中没有先前的记录)。
所以基本上,我的问题是 - rowid
FTS5 表和id
相应<name>_content
影子表之间的这种对应关系是否可以保证?或者这可能会在某些情况下或在未来的版本中中断?
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 应用程序?!我觉得我的知识存在一些巨大的漏洞,阻碍了我取得任何进展。任何好的建议或提出的解决方案将不胜感激!
android - 如何在我的 DAO 中引用可搜索的 FTS4 表而不会出现编译器错误?
用于 android 的 android [FTS4 文档][1] 声明“此类将在数据库中有一个映射 SQLite FTS4 表”。我是否应该将其解释为只需添加注释即可生成映射 SQLite FTS4 表,还是意味着我需要提供某种映射表来将 FTS4 实体类“连接”到虚拟 FTS4 表?
我目前假设前者。如果这是正确的,那么我如何在实际中使用这个映射表呢?我认为,当你创建一个带有 FTS4 注释的实体时,它会生成一个普通表和一个映射表,这两者实际上都不是一个可以使用 MATCH 函数查询的虚拟 FTS4 表。那么映射表到底映射到什么?!在运行时(可能在数据库回调或迁移期间)实现的一些假设的虚拟 FTS4 外部内容表?在那种情况下,我应该如何在我的 DAO 中引用可搜索的 FTS4 表而不会出现编译器错误?
解决了:
结果证明前一种解释是正确的,并且生成的映射表包括全文搜索所需的虚拟表。我仍然认为文档可以更清楚地说明这一点,但最终真正的潜在问题是我的房间依赖不是最新的。哦!
fts4 - FTS4 索引电话号码
如何索引 (001)12-345-6789 类型的电话号码以允许用户按子号码搜索,例如 567,而不使用 - 符号?
android - Room 报错:预打包的数据库对 FTS 表的架构无效
我正在开发一个字典应用程序,它使用 FTS 表提供搜索。定义来自一个预打包的数据库,它具有以下模式:(.schema
Linux 上 sqlite3 程序的输出)
我的实体定义如下所示:
在我看来,模式完全匹配,但 Room 有不同的意见:/
它在 logcat 中抛出此错误:
android - Room 2.1 SQLite FTS:在数据库中插入新的单个 FTS 对象
我一直在尝试使用 FTS 表的新 Android 的 Room 2.1 功能来启用搜索功能。
实体:
FTS 实体:
数据库:
道:
当我还在原始表中添加行时,我希望在 FTS 中添加每一行(ChatMessageEntity - 未显示)。从头开始重建 FTS 表时,它工作得很好(ftsRebuild()
上图)。
但是,我希望单独添加每个输入。我已经尝试了很多东西(例如saveFtsMessage()
上面显示的) - 添加没有 docId,尝试使用 rowId,...我什至尝试添加一个新对象ChatMessageEntity
作为ChatMessageFts
输入,但由于错误我没有设法编译它。
任何关于如何在 FTS 表中添加个人输入的建议都非常受欢迎!
fts4 - OperationalError:没有这样的模块:fts4
嗨,我尝试运行模糊匹配器代码,并弹出以下错误:
有什么建议么?提前致谢
编辑:我已经尝试从网站下载 sqlite zip 并将其保存在 DLL 文件中,但它仍然无法正常工作。我必须以某种方式激活它吗?
我正在使用 Anaconda3 64 位。
谢谢
sqlite - SQLite FTS4 增强的查询语法行为(使用括号)
我无法真正理解 FTS4 括号的行为,并希望得到一些解释。
以下是查询的 3 个变体,据我了解,它们都应该提供相似的结果,而哪些不是:
有趣的是,使用 SQLite 版本 3.32.2(嵌入在 DB Browser 3.12 中),这 3 个变体实际上输出了相同的 12 个结果集(预期结果,顺便说一句)。
使用 FTS5(无论 SQLite 的版本),对于查询的每 3 个变体,我也确实得到了相同的 12 个结果集。
不幸的是,目前我需要坚持使用相当旧的 SQLite 版本。
关于为什么括号似乎在上述查询中没有发挥作用的任何提示?
谢谢
android - 如何使用 FTS4 在 SQLite Android 上修复错误“函数 rank() 的参数数量错误”?
我有两张桌子:
persons
persons_fts
.
以下是表的定义:
我想对表进行查询进行全文搜索persons_fts
,并根据相关性对结果进行排名。在查看了有关如何执行此操作的官方文档后,我以以下查询结束:
除了额外的连接之外,此查询与官方文档中概述的查询完全相同。但是,当我尝试执行它时出现错误:
从表中检索数据时出错:函数 rank() 的参数数量错误(代码 1 SQLITE_ERROR)
我究竟做错了什么?
请注意,我不能选择使用 FTS5。