使用全文搜索(FTS)和OR运算符在多个列中搜索多个标记

9
我正在使用全文搜索(FTS)查询我的数据库,以提高搜索速度,因为我需要在文本描述中进行搜索。 当我尝试使用单个列进行查询时,它可以正常运行,如下所示。
select * from productsearch where productsearch match ('prod_name:panasonic*tw*')

And also,

select * from productsearch where productsearch match ('prod_short_desc:samsung*s5*')

所以,上述两个查询都可以给我期望的结果,但是当我尝试使用OR运算符组合这两个查询时,它没有给我任何结果。

select * from productsearch where productsearch match ('prod_name:panasonic*tw* OR
                                                         prod_short_desc:samsung*s5*')

所以,我想知道在使用OR运算符搜索多个列时是否有任何错误。

更新

下面的查询工作正常,但这并不满足我的要求。

select * from productsearch where productsearch match ('prod_name:panasonic* OR 
                                                            prod_short_desc:samsung*')

您可以看到,如果我删除多个令牌,那么使用OR运算符也能正常工作。


我对FTS一无所知,但是... 你可以试试:match ('prod_name:panasonic*tw*' OR 'prod_short_desc:samsung*s5*')(在同一个匹配子句中分隔字符串)或者 match ('prod_name:panasonic*tw*') OR match('prod_short_desc:samsung*s5*')(分开两个匹配子句)。 - Phantômaxx
@FrankN.Stein 尝试了两种方法,都不起作用。第一种方法会返回所有结果,这意味着它跳过了条件;第二种方法则向函数match()传递了错误的参数。 - Lalit Poptani
嗯,只是一个试验...我以为它会像普通子句一样工作(比如当你想检查一个月份是否为偶数,而日期是否为奇数时)。 - Phantômaxx
2个回答

1

所以,我最终找到了解决方案,

不再逐个搜索所有列,而是在数据库中创建了一个包含要搜索的必需列数据的单个列,

例如

我需要在prod_nameprod_short_desc列中搜索,因此我在数据库中创建了一个名为data的列,并附加了prod_nameprod_short_desc的值,然后只查找data字段就像魔法一样起作用。

prod_name | prod_short_desc

samsung  | samsung s5

所以,现在我将两列数据合并为一列,使用空格作为分隔符

数据

samsung samsung s5

然后,使用以下查询搜索非常快速。

select * from productsearch where productsearch match ('samsung*s5*')

1
SQLite的全文搜索只支持简单的前缀搜索。
查询语句如prod_short_desc:samsung*s5*由两个表达式组成:prod_short_desc:samsung*s5*,它们的行为与prod_short_desc:samsung* s5*写法完全相同。
如果您已经为增强查询语法编译了SQLite,则可以使用以下查询语句:
prod_short_desc:samsung* prod_short_desc:s5* OR prod_name:panasonic* prod_name:tw*

如果您为标准查询语法编译了SQLite,则不能使用单个查询,因为OR运算符的优先级太高,无法通过括号进行修改。

同样的问题,没有结果! - Lalit Poptani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接