- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
滚动到末尾可跳过解释。
在我的 Android 应用程序中,我想使用非英语 Unicode 文本字符串来搜索存储在 SQLite 数据库中的文本文档/字段中的匹配项。我了解到(所以我认为)我需要做的是实现 Full Text Search with fts3/fts4 ,这就是我过去几天一直在努力学习的内容。 Android 支持 FTS,如文档中所示 Storing and Searching for Data并在博文中Android Quick Tip: Using SQLite FTS Tables .
一切看起来都不错,但后来我阅读了 2012 年 3 月的博文 The sorry state of SQLite full text search on Android , 表示
The first step when building a full text search index is to break down the textual content into words, aka tokens. Those tokens are then entered into a special index which lets SQLite perform very fast searches based on a token (or a set of tokens).
SQLite has two built-in tokenizers, and they both only consider tokens consisting of US ASCII characters. All other, non-US ASCII characters are considered whitespace.
之后我还找到了this StackOverflow answer通过 @CL. (根据标签和声誉,他似乎是 SQLite 专家)回答有关将越南字母与不同变音符号匹配的问题:
You must create the FTS table with a tokenizer that can handle Unicode characters, i.e., ICU or UNICODE61.
Please note that these tokenizers might not be available on all Android versions, and that the Android API does not expose any functions for adding user-defined tokenizers.
This 2011 SO answer似乎证实 Android 不支持超出两个基本 simple
和 porter
的分词器。
现在是 2015 年了。这种情况有什么更新吗?我需要让所有使用我的应用程序的人都支持全文搜索,而不仅仅是使用新手机的人(即使最新的 Android 版本现在支持它)。
我很难相信 FTS 根本不能与 Unicode 一起工作。 documentation对于 simple
分词器说
A term is a contiguous sequence of eligible characters, where eligible characters are all alphanumeric characters and all characters with Unicode codepoint values greater than or equal to 128. All other characters are discarded when splitting a document into terms. Their only contribution is to separate adjacent terms. (emphasis added)
这让我希望 Android 仍然可以支持一些基本的 Unicode 功能,即使不支持大写和变音符号(以及具有不同 Unicode 代码点的各种其他等效字母形式)。
如果我只使用由空格分隔的文字 Unicode 字符串标记,我可以在 Android 中使用带有非英语 Unicode 文本(代码点 > 128)的 SQLite FTS 吗? (也就是说,我正在搜索文本中出现的确切字符串。)
最佳答案
补充回答
我最终按照@CL 的建议进行了操作,并成功地实现了使用 Unicode 的全文搜索。这些是我遵循的基本步骤:
ē
、è
和 é
都可以替换为 e
(如果这种通用搜索是需要的)。这不是必需的,但如果你不这样做,那么搜索é
将只返回带有é
的文档,而搜索e
将只返回带有 e
的文档(而不是 é
)。请阅读Full text search example in Android有关如何创建 FTS 表并将其链接到普通表的说明。这花了很长时间才弄清楚,但最终即使对大量文档也能进行非常快速的全文搜索。
如果您需要更多详细信息,请在下面发表评论。
关于android - Android 中使用 Sqlite 全文搜索对非英语字符的 Unicode 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29669342/
有没有办法对 Subversion 存储库执行全文搜索,包括所有历史记录? 例如,我编写了一个在某处使用过的功能,但后来不需要它,所以我对文件进行了 svn rm'd,但现在我需要再次找到它以将其用于
如何进行 MySQL 搜索,既匹配部分单词,又提供准确的相关性排序? SELECT name, MATCH(name) AGAINST ('math*' IN BOOLEAN MODE) AS rel
我在 postgresql 中创建了一个用于全文搜索的索引。 CREATE INDEX pesquisa_idx ON chamado USING gin(to_tsvector('portugues
我已经设置了一个数据库并启用了全文搜索,当我使用以下内容搜索数据库时,数据库中有一些条目包含“测试”一词,还有一个条目包含“测试更多”: SELECT keywords, title FROM dat
我想知道是否可以进行 MATCH() AGAINST()(全文)搜索,使得不直接相邻的单词需要按特定顺序排列?在我的网站上,当用户在双引号之间键入单词时,搜索将仅显示具有特定顺序的这些单词的结果。例如
我有一个 80,000 行的数据库,当我测试一些 FULLTEXT 查询时,我遇到了一个意想不到的结果。我已从 MYSQL 中删除停用词并将最小字长设置为 3。 当我执行此查询时: SELECT `s
我刚刚在我的 MYSQL 数据库中发现了一堆流氓数据... 到达它的唯一方法是通过其中一列 - FILE_PATH,其中包含文件路径的斜杠剥离版本。我需要在这组文件中找到一些恶意文件——它们的文件名都
我正在为我的站点构建一个小的搜索功能。我正在接受用户的查询,提取关键字,然后针对提取的关键字运行全文 MySQL 搜索。 问题在于 MySQL 将词干视为文字。这是正在发生的过程: 用户搜索“棒球”之
这是一个关于使用(关系)数据库设计全文搜索的系统架构问题。我使用的具体软件是 Solr 和 PostgreSQL,仅供引用。 假设我们正在构建一个有两个用户 Andy 和 Betty 的论坛 -- P
当元素数组中的数组包含应与我的搜索匹配的文本时,我无法检索文档。 这里有两个示例文档: { _id: ..., 'foo': [ { 'name
我正在使用这个查询,但不幸的是它运行缓慢: SELECT *, (MATCH(`title`) AGAINST ('$word' IN BOOLEAN MODE) * 2 + MATC
我正在构建一个非常简单的产品目录,它将在 mysql 表中存储产品,我想尽快搜索产品(并尽可能相关)。产品数据库将非常大(大约 500.000 个产品),这就是为什么使用“like”而不使用索引的搜索
select count(distinct email_address) from users WHERE MATCH (email_address) AGAINST ('@r
我正在尝试在 mySQL 中进行简单的全文搜索,但在复数方面遇到一些问题。 我确实相信我符合50% 规则。 我不认为我使用了停用词。 我正在运行这样的查询: SELECT * FROM product
我在 innoDB 数据库中使用全文搜索时遇到了一个大问题。 首先,ns_pages 表有超过 2.6m 的记录,全文索引有 3 个键 block 。 该数据库在具有 128GB RAM 的 Dell
我有一个城市和州的数据库(大约 43,000 个)。我对其进行全文搜索,如下所示: select city, state, match(city, state_short, state) agains
我正在使用带有自然语言全文的 Mysql FULLTEXT 搜索,不幸的是,我遇到了 FULLTEXT 50% 阈值,如果给定的关键字出现在总行数的 50% 时间,则不允许我搜索行。 我搜索并找到了一
如果我搜索单词hello,那么我没有匹配到,而我搜索单词hella,那么我得到了匹配。同样的情况也发生在“Non”这个词上。我在 Mac 上的 MAMP 和 sqlfiddle.com 上进行了测试,
所以我有一个简单的场景。我有一张 field 表(事件 field 等)。我的查询看起来像: SELECT * FROM venues WHERE venues.name % 'Philips Are
我有一个表,其中有视频数据,如“标题”、“描述”等。我正在尝试使用 MySQL 全文索引编写一个搜索引擎。 SQL 查询适用于某些单词,但不是每个单词。这是我的 SQL 查询; SELECT * FR
我是一名优秀的程序员,十分优秀!