在 Android 上使用 sqlite(带有 FTS)

2023-12-11

我正在使用 sqlite FTS3 数据库和我的 Android 应用程序。

   public Cursor getWordMatches(String query, String[] columns) {
        String selection = KEY_WORD + " MATCH ?";
        String[] selectionArgs = new String[] {query+"*"};
        return query(selection, selectionArgs, columns);
   }

.....

private Cursor query(String selection, String[] selectionArgs, String[] columns) {
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
    builder.setTables(FTS_VIRTUAL_TABLE);
    builder.setProjectionMap(mColumnMap);     

    Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(),
            columns, selection, selectionArgs, null, null, null);

    if (cursor == null) {
        return null;
    } else if (!cursor.moveToFirst()) {
        cursor.close();
        return null;
    }
    return cursor;
}

如果我进行查询并搜索“house”,我将得到:

household 
house 
apartment house 
big house

(我在正则表达式中得到了所有有房子的东西house)

我怎样才能得到这样的查询结果?

household
house

(所以我只想要以 house 开头的结果,在正则表达式 house* 中)

如果我使用 LIKE 语句,我的 Android 应用程序会强制关闭(可能是因为数据库有 200000 行)。 那么我应该以某种方式结合 MATCH 和 LIKE 语句吗? 是否可以在 Android 上执行此操作,如果不是,也许我应该在从该查询中获取光标后尝试在光标上运行一些正则表达式?


全文搜索表应始终使用 MATCH 而不是 LIKE,因为 LIKE 查询对表执行完整扫描,这违背了创建 FTS 表的初衷。

要解决您的问题,请在创建 fts 表时尝试使用默认值以外的标记生成器:

-- Create a table using the simple tokenizer.
CREATE VIRTUAL TABLE simple USING fts3(tokenize=porter);

默认情况下,SQLite 使用一个简单的标记生成器,它可能会生成您不想要的匹配项。切换到 porter tokenizer 并看看会发生什么。最坏的情况是,您可以实现自己的自定义分词器。请参阅SQLite 文档欲了解更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 上使用 sqlite(带有 FTS) 的相关文章

随机推荐