SQLite Fts选择查询

时间:2014-03-22 08:41:20

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

我正在制作一本超过20,000字的字典。因此,为了使搜索数据更快,我使用fts3表来完成它。 我的选择查询:
Cursor c=db.rawQuery("Select * from data where Word MATCH '"+word+"*'", null);

使用此查询,它将显示包含“word”的所有单词,但我想要的只是获取包含搜索单词开头的单词。 这意味着我希望它像这个查询一样工作:

Cursor c=db.rawQuery("Select * from data where Word like '"+word+"%'", null);

Ex:我有:苹果,app,和书,坏,猫,车。 当我输入'a'时:我希望它只显示:apple,app和

我可以用这个解决什么?

2 个答案:

答案 0 :(得分:0)

FTS支持使用^搜索字符串的开头:

SELECT * FROM FtsTable WHERE Word MATCH '^word*'

但是,全文搜索索引旨在查找较大文本中的单词。

如果您的Word列只包含一个字,那么如果您使用LIKE 'a%'并依赖普通索引,则查询会更有效。 要允许索引与LIKE一起使用,表列必须具有TEXT affinity,并且索引必须声明为COLLATE NOCASE(因为LIKE不区分大小写):

CREATE TABLE data (
    ...
    Word TEXT,
    ...
);
CREATE INDEX data_Word_index ON data(Word COLLATE NOCASE);

如果您要使用GLOB,则索引必须区分大小写(默认值)。

您可以使用EXPLAIN QUERY PLAN检查查询是否使用索引:

sqlite> EXPLAIN QUERY PLAN SELECT * FROM data WHERE Word LIKE 'a%';
0|0|0|SEARCH TABLE data USING INDEX data_Word_index (Word>? AND Word<?)

答案 1 :(得分:0)

table(_id primary key not null autoincrement, word text) 

FTS表不使用上述属性。它忽略了数据类型。除了隐藏的rowid列之外,它不会自动递增列。 “_id”不会在这里充当主键。请确认您正在实施FTS表

https://www.sqlite.org/fts3.html

  

可以为每列指定数据类型名称。这是   纯语法糖,FTS或者不使用提供的类型名称   SQLite核心用于任何目的。这同样适用于任何约束   与FTS列名一起指定 - 它们被解析但未被使用   或以任何方式由系统记录

对于您的原始问题,匹配“abc *”已经从单词的开头搜索。例如匹配“man *”将不匹配“woman”。

相关问题