我有一个带区分大小写文本的SQL表。现在,我想搜索(不区分大小写)文本中是否出现单词。当然,一种方法是只执行[...] text LIKE '% <word1> %' AND text LIKE '% <word2> %' ...
,但是由于它是LIKE '%
,因此始终是全表扫描,并且无法使用索引。我的问题:可以优化吗?
我发现的一件事是instr(text, '<word1>') > 0
,但这是区分大小写的。我也用COLLATE NOCASE
进行了尝试,但没有任何改变。唯一的办法是instr(lower(text), '<word1>')
,这又是由于lower(...)
不太好(所有搜索词均保证小写)。
Here's一个不起作用的小例子:
CREATE TABLE T (c VARCHAR(10) COLLATE NOCASE);
INSERT INTO T (c) values ("A");
INSERT INTO T (c) values ("b");
CREATE INDEX CONTENT_TEXT ON T(c COLLATE NOCASE);
SELECT * FROM T WHERE instr(c, 'a') COLLATE NOCASE;
非常有效地不区分大小写地搜索较大字符串中的单词的一种方法是使用full text search extension。
示例:
sqlite> CREATE VIRTUAL TABLE test USING fts5(foo);
sqlite> INSERT INTO test(foo) VALUES ('the quick red fox jumped over the lazy brown dog');
sqlite> SELECT * FROM test WHERE test MATCH 'FOX';
foo
------------------------------------------------
the quick red fox jumped over the lazy brown dog
如果您的数据已经存在于表中,则可能需要external content模式来节省空间。