如何用SQLite的FTS3实现模糊搜索?

时间:2014-12-19 10:36:48

标签: android sqlite search full-text-search fts3

我已经integrated search based on the official Android documentation了 我正在使用以下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
    • M y F ancy tem
  • fan item fanit fit
    • 我的粉丝 cy em
    • 您的粉丝 cy em
  • ititem im itm
    • 我喜欢 te m
    • 我的秘密 te m
    • te m #1
    • 您的想法 te m

结果应根据匹配的好坏进行排名,例如,如果字母越远,它们的排名应低于完全匹配,例如mfi:“我喜欢的项目”应排在最后“MFI thingy”应该排名第一(如果有这样的项目)。

注意:我的min SDK是API级别10,means it has to work SQLite 3.6.22

类似的功能主要在IDE中找到:

2 个答案:

答案 0 :(得分:4)

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

此类模糊搜索没有内置功能。 (并且Android数据库API不允许您添加自定义虚拟表实现。)

答案 1 :(得分:1)

我放松了我的标准来搜索所有单词的开头:

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

效果很好。没有拼写错误,但是当我使用它时感觉很自然。