我正在制作一本超过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和
我可以用这个解决什么?
答案 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”。