Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何用SQLite实现模糊搜索';什么是FTS3?_Android_Sqlite_Search_Full Text Search_Fts3 - Fatal编程技术网

Android 如何用SQLite实现模糊搜索';什么是FTS3?

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

我已经和 我正在使用以下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 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中找到:

  • 日食:及
  • 智能思想
  • 崇高的文本

SQLite的FTS只允许搜索整个单词或单词前缀

像这样的模糊搜索没有内置功能。
(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> >匹配“随机按钮和安全别针”。