我在iOS应用程序中使用SQLite FTS扩展。它表现良好,但问题是它只匹配字符串前缀(或从关键字搜索开始)。
即
这项工作:
SELECT FROM tablename WHERE columnname MATCH 'searchterm*'
但以下两个没有:
SELECT FROM tablename WHERE columnname MATCH '*searchterm'
SELECT FROM tablename WHERE columnname MATCH '*searchterm*'
是否有任何解决方法,或使用FTS构建类似于LIKE '%searchterm%'
查询的查询的任何方法。
编辑:
正如Retterdesdialogs所指出的,以相反的顺序存储整个文本并在相反的字符串上运行前缀搜索是解决以/后缀结尾的搜索问题的一个可能的解决方案,这是我最初的问题,但它不适用于"包含"搜索。我已相应地更新了这个问题。
在我的iOS和Android应用程序中,我一直回避FTS搜索,原因正是由于缺乏后缀查询,它不支持子字符串匹配。
变通办法似乎很复杂。
我使用了LIKE查询,虽然性能不如MATCH,但它满足了我的需求。
解决方法是将反向字符串存储在一个额外的列中。看到这个链接(它不完全相同,它应该给出一个想法):
使用全文搜索搜索后缀
要使其适用于包含查询,您需要存储希望能够搜索的术语的所有后缀。这样做的缺点是使数据库变得非常大,但可以通过压缩数据来避免这种情况。
SQLite FTS包含和后缀匹配
您只需执行反向文本插入和搜索:
CREATE VIRTUAL TABLE products
USING FTS5(name, brand, code);
INSERT INTO products(name, brand, code)
VALUES('Merlot Cafe', 'Healthy Choice', '07265500101'), (
'tolreM efaC', 'yhtlaeH eciohC', '10100556270');
SELECT *
FROM products
WHERE products MATCH 'Ice* OR eci*'