【发布时间】:2021-05-06 06:59:50
【问题描述】:
我有一个 SQLite FTS5 虚拟表,并试图在我的前缀查询结果中突出显示文本。我知道 highlight() 和 sn-p() 辅助功能,但是它们似乎并不完全支持我正在尝试做的事情。如果我的数据如下所示:
fts.my_data
-----------
John
Mike
Bill
Jane
我想使用前缀匹配进行查询,例如
select * from fts where fts match 'j*';
highlight 和 sn-p 函数(假设 <b>...</b> 标签)将返回
<b>John</b>
<b>Jane</b>
但我只想在通配符之前突出显示匹配的前缀的确切部分:
<b>J</b>ohn
<b>J</b>ane
似乎没有任何方法可以使用现有的 FTS5 辅助功能来做到这一点。我意识到 FTS5 提供了一个 API,以便您可以创建自己的辅助功能。我也可以在应用程序代码中实现该解决方案(我正在使用 Swift),尽管我怀疑这个问题可能会导致很多尝试在应用程序代码中实现的问题(例如,如何处理词干提取)。在我麻烦实施自己的解决方案之前,有谁知道我正在尝试做的事情是否真的可以使用现有的 highlight 和/或 sn-p 函数?如果是这样,你能解释一下吗?
另外,我观察到其他几个现有应用程序(例如联系人+)提供此功能,所以我知道这是可能的,并且我也想知道如果有人知道他们是如何做到的。
【问题讨论】:
-
experimental trigram tokenizer 仅匹配提供的内容。在本地进行实验,它以您要求的方式突出显示。 t 不适用于查询“match 'J*'”,因为它只能匹配 3 个或更多 unicode 字符的短语。
-
感谢您的帮助,trigram tokenizer 似乎确实可以满足我的要求。从命令行使用 sqlite3,我能够创建一个虚拟表并运行一些测试查询,并且 highlight 和 sn-p 似乎都给了我想要的东西。当我从 Swift 查询时,我现在卡住了,我收到“没有这样的标记器:三元组”错误。我检查了“PRAGMA compile_options;”从我正在运行的 iOS 应用程序内部,选项 ENABLE_FTS5 在结果中,还报告 SQLite 版本“3.32.3”,但在与 iOS 捆绑的 SQLite 中仍然缺少一些东西以启用三元标记器。
-
糟糕,trigram 标记器后来发布了两个小版本 - 在3.34.0。一位 SQLite 开发人员在回复 a recent forum post from Simon Willison 时提出了它。可以将您自己的 SQLite 版本与您的应用程序捆绑在一起(例如,with SQLite.swift)。不过,我猜想编写自己的代码来突出显示会更容易。
-
再次感谢您的帮助。这不是微不足道的,但我确实设法使用 XCode 为 iOS 编译了 3.34.0,并确认我在我的 Swift iOS 应用程序中使用了该版本。但是,trigram 标记器必须从源代码构建为动态库并在运行时加载。 Apple 不允许您在 iOS 上运行动态链接库(它们只允许系统动态库)。所以,不确定这是否可能:编译我自己的 SQLite 版本并在 iOS 上运行时加载 trigram 扩展。我现在想弄清楚如何将 ftstri 编译为静态库。
-
所以我盯着电脑看太久了。如上所述,trigram 标记器是在 SQLite 3.34 中发布的,在 Release Notes 中得到确认。所以理论上我应该可以自己编译 3.34.0 而不必单独加载 trigram 扩展。
标签: swift sqlite full-text-search fts5