3

我有一个 SQLite FTS5 虚拟表,并试图在我的前缀查询结果中突出显示文本。我知道 highlight() 和 snippet() 辅助功能,但是它们似乎并不完全支持我正在尝试做的事情。如果我的数据如下所示:

fts.my_data
-----------
John
Mike
Bill
Jane

我想使用前缀匹配进行查询,例如

select * from fts where fts match 'j*';

高亮和片段功能(假设<b>...</b>标签)将返回

<b>John</b>
<b>Jane</b>

但我只想在通配符之前突出显示匹配的前缀的确切部分:

<b>J</b>ohn
<b>J</b>ane

使用现有的 FTS5 辅助功能似乎没有任何方法可以做到这一点。我意识到 FTS5 提供了一个 API,以便您可以创建自己的辅助功能。我也可以在应用程序代码中实现该解决方案(我正在使用 Swift),尽管我怀疑这个问题可能会导致很多尝试在应用程序代码中实现的问题(例如,如何处理词干提取)。在我麻烦实施自己的解决方案之前,有谁知道我正在尝试做的事情是否真的可以使用现有的突出显示和/或片段功能?如果是这样,你能解释一下怎么做吗?

此外,我观察到其他几个现有的应用程序(例如 Contacts+)提供了这种功能,所以我知道这是有可能的,并且我也想知道如果有人知道他们是如何做到的。

4

1 回答 1

4

对于寻求解决此问题的其他人,我能够弄清楚如何解决此问题。

trigram 标记器被添加为 SQLite 3.34.0( 2020 年 12 月 1 日发布)中的内置标记器之一。

就我而言,我正在部署到 iOS,目前默认情况下只有 SQLite 3.32 与它捆绑在一起,正如此 wiki 页面所确认的那样。因此,我能够下载 SQLite 源代码并将其作为项目添加到我的 XCode 工作区作为“静态库”,并从我的应用程序项目中引用生成的 .a 静态库文件。我还必须在 SQLite 项目的 XCode 编译器选项中设置适当的 C 标志,以使一切正常工作。但是我现在可以分发我自己提供的 SQLite 版本(3.34.1),使用我的特定选项编译,使用 FTS5 和 trigram 标记器。

于 2021-02-04T19:28:07.480 回答