使用全文本搜索 (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_name
和 prod_short_desc
列中搜索,所以我在数据库中创建了一个名为 data
的列,并附加了 prod_name
和 prod_short_desc
的值,然后只查找 data
字段工作像一个魅力
产品名称 | prod_short_desc
samsung | samsung s5
所以,现在我将两列的数据合并为一个,用空格作为分隔符
数据
三星三星s5
然后搜索确实非常快,下面的查询,
select * from productsearch where productsearch match ('samsung*s5*')
【讨论】:
以上是关于使用全文本搜索 (FTS) 在多个列中搜索多个标记,使用 OR 运算符的主要内容,如果未能解决你的问题,请参考以下文章