如何用SQLite的FTS3实现模糊search?

我已经集成了基于官方Android文档的search ,我正在使用下面的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
  • 你的花式项目

当用户在search框中键入blah ,search结果将显示:

  • my
    • 我的花式项目
    • 我的秘密物品
  • mfi
    • 我很高兴
  • fan itemfanitfit
    • 我的粉丝 cy em
    • 你的粉丝 cy em
  • ititemimitm
    • 我的花式 te m
    • 我的秘密我的
    • 我是 #1
    • 喜欢我的

结果应该根据比赛的好坏来排名,例如,如果字母离得越远,他们的排名应该低于完全匹配,比如mfi :“My Fancy Item”应该排在最后,“MFI thingy”应该排在第一位(如果有这样的项目)。

注意:我最小的SDK是API级别10,这意味着它必须使用SQLite 3.6.22 。

类似的function大部分可以在IDE中find:

  • Eclipse: Open Type和Open Resource
  • IntelliJ IDEA 导航到*
  • 崇高的文本去任何东西

  • 如何在android的Realm中实现以下function
  • HTML5 Webapp作为iPhone和Android上的常规图标或应用程序。
  • 从SQLite数据库表中删除所有的表行
  • 一个简单的Cordova android示例,包括Sqlite读/写和search
  • window.openDatabase()和window.sqlitePlugin.openDatabase()函数之间的区别?
  • Android SQLite - Cursor和ContentValues
  • 如何testing在SQLiteDatabase查询中游标是否为空
  • 原始SQLite游标上的registerContentObserver()
  • SQLite的FTS只允许search整个单词或单词前缀。

    没有像这样的模糊search的内置function。 (而Android数据库API不允许你添加自定义虚拟表的实现。)

    我放松了我的标准去search所有的单词开始:

     private static String fixQuery(String query) { return query.trim().replaceAll("\\s+", "*") + "*"; } 

    它工作得很好。 没有打字错误,但使用时感觉很自然。