我正在使用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
(所以我只想要以房子开头的结果,在正则表达式中*)
我的android应用程序FORCE CLOSES如果我使用LIKE语句(可能因为db有200000行)。 我应该以某种方式结合MATCH和LIKE语句? 甚至可以在Android上执行此操作,如果不是这样,我可以尝试在从此查询中获取它后在光标上运行一些正则表达式吗?
答案 0 :(得分:0)
全文搜索表应始终使用MATCH而不是LIKE,因为LIKE查询会执行表的完整扫描,这首先会破坏创建FTS表的目的。
要解决您的问题,请在创建fts表时尝试使用非默认标记器:
-- Create a table using the simple tokenizer.
CREATE VIRTUAL TABLE simple USING fts3(tokenize=porter);
默认情况下,SQLite使用一个简单的标记生成器,它可能会生成您不想要的匹配项。切换到porter tokenizer,看看会发生什么。最坏的情况是,您可以实现自己的自定义标记生成器。有关详细信息,请参阅SQLite documentation。