Android,变音符号不敏感 SQLite 搜索

Posted

技术标签:

【中文标题】Android,变音符号不敏感 SQLite 搜索【英文标题】:Android, Diacritic Insensitive SQLite Search 【发布时间】:2012-09-19 09:33:26 【问题描述】:

我正在尝试在 android 中查询 SQLite 数据库,其中带有重音符号的法语字符应像普通拉丁字符一样处理,例如:

SELECT * FROM x WHERE y LIKE %cafe%

应该返回

café, câfè, ...

我已经用谷歌搜索了一整天,并阅读了关于 *** 的所有相关帖子。 无法向包含规范化标题的表添加列,因为数据库是从服务器获取并由第三方维护的。

使用其他帖子中提到的排序规则,例如

Latin1_general_CI_AI

也没有选择,因为 SQLite 仅支持 3(在 android 5 中)对我没有帮助的排序规则。

将android中的数据库设置为

Locale.FRENCH

并使用排序规则

COLLATE LOCALIZED

也不行。

我知道 ios (DiacriticInsensitiveSearch) 中有一些标志会自动执行此操作,所以我希望类似的东西也可用于 android。

有什么想法吗?提前致谢!

【问题讨论】:

根据 sqlite.org/datatype3.html 第 6 节,我认为 sqlite3 不支持那种东西 然而,根据这个问题***.com/questions/3480999/… = 比较可能有效 不确定 FTS3/4 是否可以以某种方式做到这一点,但您可以尝试一下。不过***.com/q/12500799/995891 对这些字符有问题。 感谢您的回答 njzk2。 =比较有效,但在我的情况下,因为字符串“cafe”也应该找到像“café au lait”这样的标题。如果我使用 = 比较,情况并非如此......但无论如何谢谢! @zapl:谢谢!会检查一下,让你知道我发现了什么! 【参考方案1】:

无法向表中添加包含规范化标题的列,因为数据库是从服务器获取并由第三方维护的。

您可以使用规范化列和原始表的外键创建单独的表。我认为这是您在 android 上使用 sqlite 的唯一选择。

或者如果你能以某种方式创建用户定义函数remove_diacritics,那么你会选择这样的:

SELECT * FROM x WHERE remove_diacritics(lower(y)) 
LIKE remove_diacritics(lower(%cafe%))

但要注意x.y 上的索引不会被使用。您也可能不需要lower。但据我所知,如果可能的话,在 sqlite 上创建函数并不是那么容易。

【讨论】:

感谢您的回答 Oliv:“您可以使用规范化列创建单独的表”-不,因为这应该是通用的。每当发生变化时,我都无法维护表格......“如果可能的话,在 sqlite 上创建函数并不是那么容易” - 不幸的是这是不可能的...... 您可以在每次获取后更新第二个表...顺便问一下,“数据库是从服务器获取的”是什么意思?你自己取吗?提取过程本身不能创建两列吗? 嗯,数据库位于服务器上,客户不时上传一个新的。也许 fetch 过程可以做到,但我需要一个算法来告诉这个过程,é、è 和 ê 是 e... 会看到...

以上是关于Android,变音符号不敏感 SQLite 搜索的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式搜索忽略 NSPredicate 的某些字符?

C - 如何避免变音符号/重音敏感问题

Ruby 超级不敏感的正则表达式将学校名称与口音和其他变音符号匹配

swift 3 - 搜索结果也带有变音符号

Azure 搜索语言分析器和变音符号

iPhone CoreData:使用变音符号排序