如何在Android中的SQlite中使用预准备语句?
是否在Android版本中启用了SQLite3 FTS4?
Android是否有办法进行全文搜索?
我知道甚至不可能通过笔记字段搜索联系人,谷歌是搜索公司,但如果没有API,我会感到失望.
这更像是一个设计问题 - 而不仅仅是编码问题.
我已经有一个应用程序,可以在SQLite数据库表中存储数据.现在我想在此添加搜索功能.
据我所知,为了启用搜索功能,我需要FTS表.
我拥有的表格(不完全相同,但给出了非常相似的例子):
内容表 - 包含以下列:Id,标题,内容,创建者,创建者,更改者,更改者等...
评论表 - 包含以下列:Id,评论,创建者,创建者,回复等...
其他表格,如用户数据,元数据,类别,标签等.
在这里,我只想要标题,内容和评论的搜索功能.显然我不需要像其他列那样的搜索功能.
哪个是最好的选择?
我在选项1中看到的问题是:
我在选项2中看到的问题是:
那么,最好的选择是什么?有任何机构面临类似的挑战吗?
滚动到最后跳过解释。
在我的 Android 应用程序中,我想使用非英语 Unicode 文本字符串来搜索存储在 SQLite 数据库中的文本文档/字段中的匹配项。我了解到(所以我认为)我需要做的是使用 fts3/fts4实现全文搜索,这就是我过去几天一直在学习的内容。Android 支持 FTS,如文档存储和搜索数据和博客文章Android 快速提示:使用 SQLite FTS 表中所示。
一切看起来都不错,但后来我阅读了 2012 年 3 月的博客文章Android 上 SQLite 全文搜索的遗憾状态,其中说
构建全文搜索索引的第一步是将文本内容分解为单词,也就是标记。然后将这些标记输入一个特殊的索引,让 SQLite 基于一个标记(或一组标记)执行非常快速的搜索。
SQLite 有两个内置的标记器,它们都只考虑由美国 ASCII 字符组成的标记。所有其他非美国 ASCII 字符都被视为空格。
之后,我还找到了@CL 的这个 StackOverflow 答案。(根据标签和声誉,他似乎是 SQLite 专家)回答有关将越南字母与不同变音符号匹配的问题:
您必须使用可以处理 Unicode 字符(即 ICU 或 UNICODE61)的标记器创建 FTS 表。
请注意,这些分词器可能并非在所有 Android 版本上都可用,并且 Android API 不会公开任何用于添加用户定义的分词器的函数。
这个 2011 SO answer似乎证实了 Android 不支持超出两个基本simple和porter …
我正在尝试创建一个收集用户大量笔记的应用程序.我想在笔记上实现全文搜索,以便用户可以从整个笔记列中获得相关的笔记.我正在为此寻找解决方案.SQLite实际上支持全文搜索(FTS),但它是否适用于Android?有人可以开导我这个吗?
我在SQLite中创建一个FTS4外部内容表,如下所示:
CREATE TABLE t2(id INTEGER PRIMARY KEY, col_a, col_b, col_text);
CREATE VIRTUAL TABLE fts_table USING fts4(content="t2", col_text);
Run Code Online (Sandbox Code Playgroud)
我使用的是外部内容表,以便我并不需要存储的重复值col_text在fts_table.我只是索引col_text因为col_a并且col_b不需要索引.
然而,当我做一个查询fts_table这样的
SELECT * FROM fts_table WHERE fts_table MATCH 'something';
Run Code Online (Sandbox Code Playgroud)
我没有访问col_a,并col_b从内容表t2.如何返回所有这些列(col_a,col_b,col_text)从单个FTS查询?
更新
我尝试使用该notindexed=column_name选项
CREATE VIRTUAL TABLE fts_table USING fts4(content="t2", col_a, col_b, col_text, notindexed=col_a, notindexed=col_b);
Run Code Online (Sandbox Code Playgroud)
这应该适用于某些人,但我在Android中使用它,notindexed直到SQLite 3.8才支持该选项,Android直到Android版本5.x才支持.我需要支持android 4.x. 我正在更新此问题以包含Android代码.
我正在尝试订购快速文本搜索,以便完全匹配是第一个,部分匹配是最后一个.
我创建了一个在SQLiteStudio中工作的查询:
SELECT value, 1 AS _order FROM glossfts
WHERE glossfts.value MATCH 'dog'
UNION
SELECT value, 2 AS _order FROM glossfts
WHERE glossfts.value MATCH 'dog* NOT dog'
ORDER BY _order
Run Code Online (Sandbox Code Playgroud)
结果就是这样
Beware of dog 1
Disliked by everybody, not even a dog will eat 1
Bad dog 1
Creed, dogma 2
Dogs 2
Dogwood 2
Run Code Online (Sandbox Code Playgroud)
这很好用但是当我在android中使用相同的查询时我才会得到
Beware of dog 1
Disliked by everybody, not even a dog will eat 1
Bad dog 1
Disliked by everybody, not even a dog …Run Code Online (Sandbox Code Playgroud)