SQLite中普通索引和FTS有什么区别
What's the difference of normal index and FTS in SQLite
两者都使用索引来加速字符串搜索。那有什么区别呢?
在 docs for CREATE INDEX
中,没有提到 tokenization
,这让我觉得文本列上的普通索引只会加速“=”查询,而不是更复杂的 MATCH
查询可以匹配段落内的单词,但我找不到任何来源证实这一点。
which makes me think that normal indices on text columns only speed up "=" queries
一般情况下,文本列上的标准 B-Tree 索引会加速 SARGable 查询,例如:
SELECT col FROM tab WHERE col = 'value'
SELECT col FROM tab WHERE col LIKE 'value'
SELECT col FROM tab WHERE col LIKE 'value%'
但不是:
SELECT col FROM tab WHERE col LIKE '%value%';
SELECT col FROM tab WHERE col LIKE '%value';
SELECT col FROM tab WHERE UPPER(col) = 'VALUE';
他们仍然可以受益于索引扫描而不是阅读 table,但它不会像索引搜索那样快。
文本中的短语顺序在正常查找中很重要,当您搜索以下内容时找不到 'aaa bbb'
:
Select * from table where text like 'bbb aaa'
但在全文搜索中您可以找到它。
两者都使用索引来加速字符串搜索。那有什么区别呢?
在 docs for CREATE INDEX
中,没有提到 tokenization
,这让我觉得文本列上的普通索引只会加速“=”查询,而不是更复杂的 MATCH
查询可以匹配段落内的单词,但我找不到任何来源证实这一点。
which makes me think that normal indices on text columns only speed up "=" queries
一般情况下,文本列上的标准 B-Tree 索引会加速 SARGable 查询,例如:
SELECT col FROM tab WHERE col = 'value'
SELECT col FROM tab WHERE col LIKE 'value'
SELECT col FROM tab WHERE col LIKE 'value%'
但不是:
SELECT col FROM tab WHERE col LIKE '%value%';
SELECT col FROM tab WHERE col LIKE '%value';
SELECT col FROM tab WHERE UPPER(col) = 'VALUE';
他们仍然可以受益于索引扫描而不是阅读 table,但它不会像索引搜索那样快。
文本中的短语顺序在正常查找中很重要,当您搜索以下内容时找不到 'aaa bbb'
:
Select * from table where text like 'bbb aaa'
但在全文搜索中您可以找到它。