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

Posted

技术标签:

【中文标题】使用全文本搜索 (FTS) 在多个列中搜索多个标记,使用 OR 运算符【英文标题】:Searching in multiple columns using Full Text Search(FTS) with multiple tokens using OR operator 【发布时间】:2014-09-24 08:37:33 【问题描述】:

我正在使用 FTS 来查询我的数据库以提高搜索速度,因为我还需要在文本描述中进行搜索,

当我尝试使用单列查询时,它的工作正常,如下所示

select * from productsearch where productsearch match ('prod_name:panasonic*tw*')

还有,

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*')(分隔匹配子句) ? @FrankN.Stein 两者都试过了,都不起作用第一个给出所有结果,这意味着它完成了跳过条件,第二个给出了函数 match() 的错误参数 好吧,只是一个试验......我认为它会像一个正常的子句一样工作(比如当你想检查一个月是偶数还是一天是奇数时)。 【参考方案1】:

SQLite 的 FTS 仅支持简单的前缀搜索。

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 运算符的优先级太高,无法用括号修改。

【讨论】:

同样的问题,没有结果!【参考方案2】:

所以,我终于找到了解决办法,

我没有从所有列中单独搜索,而是在数据库中创建了一个列,其中包含要搜索的所需列的数据,

例子

我需要在 prod_nameprod_short_desc 列中搜索,所以我在数据库中创建了一个名为 data 的列,并附加了 prod_nameprod_short_desc 的值,然后只查找 data 字段工作像一个魅力

产品名称 | prod_short_desc

samsung  | samsung s5

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

数据

三星三星s5

然后搜索确实非常快,下面的查询,

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

【讨论】:

以上是关于使用全文本搜索 (FTS) 在多个列中搜索多个标记,使用 OR 运算符的主要内容,如果未能解决你的问题,请参考以下文章

包含多个世界的列中的全文搜索搜索

是否可以将全文搜索 (FTS) 与 LINQ 一起使用?

SQlite 全文搜索(FTS)?

Peewee 可以使用 SQLite 的 FTS5(全文搜索)辅助函数 highlight() 吗?

PhoneGap、SQLite 和全文搜索

自2008 R2以来,是否有任何Sql Server全文搜索(FTS)性能改进?