android – SQLite:大表中的高效子字符串搜索

前端之家收集整理的这篇文章主要介绍了android – SQLite:大表中的高效子字符串搜索前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个 Android应用程序,它必须在一个大表中执行子字符串搜索(大约500’000个带有街道和位置名称的条目,所以每个条目只有几个单词).
CREATE TABLE Elements (elementID INTEGER,type INTEGER,name TEXT,data BLOB)

请注意,只有20%的条目包含“name”列中的字符串.

执行以下查询几乎需要2分钟:

SELECT elementID,name FROM Elements WHERE name LIKE %foo%

我现在尝试使用FTS3来加速查询.这非常成功,查询时间减少到1分钟(令人惊讶的是,数据库文件大小仅增加了5%,这对我的目的来说也相当不错).

问题是,FTS3似乎不支持子串搜索,即如果我想在“foo bar”和“foobar”中找到“bar”,我只得到“foo bar”,尽管我需要两个结果.

所以实际上我有两个问题:

>是否可以进一步加快查询速度?我的目标是查询30秒,但我不知道这是否真实……
>如何使用FTS3进行真正的子串搜索

解决方法

解决方案1:
如果您可以将数据库中的每个字符作为单个单词,则可以使用 phrase queries搜索子字符串.

例如,假设“my_table”包含单个列“person”:

person
------
John Doe
Jane Doe

你可以改成它

person
------
J o h n D o e
J a n e D o e

搜索子字符串“ohn”,请使用短语查询

SELECT * FROM my_table WHERE person MATCH '"o h n"'

请注意“JohnD”将匹配“John Doe”,这可能并不理想.
要修复它,请将原始字符串中的空格字符更改为其他字符.

例如,您可以用“$”替换空格字符:

person
------
J o h n $D o e
J a n e $D o e

解决方案2:
按照解决方案1的想法,您可以使用自定义标记生成器将每个字符作为单个单词,并使用短语查询查询子字符串.

解决方案1的优势在于您不必在数据中添加空格,这可能会不必要地增加数据库的大小.

缺点是您必须实现自定义标记生成器.幸运的是,我有one ready for you.代码是在C中,所以你必须弄清楚如何将它与Java代码集成.

猜你在找的Android相关文章