以(suffix)结尾,包含在SQLite FTS中使用MATCH的字符串搜索

nr9pn0ug  于 2023-05-18  发布在  SQLite
关注(0)|答案(4)|浏览(166)

我在我的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所指出的,以相反的顺序存储整个文本并在反向字符串上运行前缀搜索是以/后缀结尾搜索问题的可能解决方案,这是我最初的问题,但它不适用于“包含”搜索。我已经相应地更新了问题。

wi3ka0sx

wi3ka0sx1#

在我的iOS和Android应用程序中,我一直回避FTS搜索,因为它不支持子字符串匹配,因为缺乏后缀查询。
解决方法似乎很复杂。
我使用了LIKE查询,虽然它的性能不如MATCH,但满足了我的需求。

eoxn13cs

eoxn13cs2#

解决方法是将反向字符串存储在额外的列中。看到这个链接(它不完全相同,它应该给予一个想法):
Search Suffix using Full Text Search

wmtdaxz3

wmtdaxz33#

为了让它对contains查询起作用,您需要存储您希望能够搜索的术语的所有后缀。这样做的缺点是使数据库变得非常大,但是可以通过压缩数据来避免。
SQLite FTS contains and suffix matches

vof42yt1

vof42yt14#

你可以只做反向文本插入和搜索:

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*'

相关问题