Android 如何用SQLite实现模糊搜索';什么是FTS3?
我已经和 我正在使用以下SQLite模式和查询:Android 如何用SQLite实现模糊搜索';什么是FTS3?,android,sqlite,search,full-text-search,fts3,Android,Sqlite,Search,Full Text Search,Fts3,我已经和 我正在使用以下SQLite模式和查询: CREATE VIRTUAL TABLE Search USING FTS3 ( _id, name, location ); select * from Search where name MATCH ? -- where ? is the user typed exact "query" -- or if it doesn't have spaces or stars I append a star to searc
CREATE VIRTUAL TABLE Search USING FTS3 (
_id,
name,
location
);
select * from Search where name MATCH ?
-- where ? is the user typed exact "query"
-- or if it doesn't have spaces or stars I append a star to search prefix: "query*"
我想知道如何扩展它?允许以下操作:
假设我有一些项目名为:
- 我喜欢的东西
- 我的秘密物品
- 项目#1
- 你喜欢的东西
blah
时,搜索结果将显示:
my
- 我的精美物品
- 我的秘密物品
mfi
- MyFItem
,风扇项目
,fanit
fit
- 我的粉丝cyItem
- 你的粉丝cyItem
,it
,item
,im
itm
- 我的幻想Item
- 我的秘密Item
- Item#1
- 你的幻想Item
mfi
:“我喜欢的项目”应排在最后,“mfi thingy”应排在第一位(如果有这样的项目)
注意:我的min SDK是API级别10,它是
类似的功能主要可以在IDE中找到:
- 日食:及
- 智能思想
- 崇高的文本
(Android数据库API不允许您添加自定义虚拟表实现。)我放宽了搜索所有单词开头的条件:
private static String fixQuery(String query) {
return query.trim().replaceAll("\\s+", "*") + "*";
}
它工作得很好。不防打字,但使用时感觉很自然。没有一种方法可以实现模糊搜索。您的要求太模糊,无法给出正确的答案。
*l*i*k*e*t*h*i*s*
。。。但我确实担心这个的效率solution@popovitsj用户键入任何内容,如果它与名称的某个部分匹配,就会显示结果。如果它这么简单,那么@Selvin是正确的,但这几乎没有什么用处。从用户的角度来看,它会提供许多“意外”匹配。您可以使用sim度量进行模糊搜索,这对数量有限的输入链接非常有用:有什么替代方法吗?您能解释一下这是怎么回事吗?@thegreencolla“搜索所有单词的开头”\\s+
regex表示“任何连续的空格”所以ab-cd-ef
将变成ab*cd*ef*
,谢谢。我认为这就是Python实现的模糊搜索的一篇文章所做的。我使用的是Laravel,我发现我可以简单地使用范围查询。如果这不起作用,我会回到你的解决方案。谢谢。我想*只能出现在搜索词的末尾,而不能出现在middle@MohammadYahia我知道它也在中间工作,我在我的库存应用程序中使用:<代码> FixQuy(“但是SAF”)->“但是*SAF*”< /C> >匹配“随机按钮和安全别针”。