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

时间:2014-09-24 08:37:34

标签: android sqlite full-text-search fts4

我正在使用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运算符一起使用。

2 个答案:

答案 0 :(得分: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运算符的优先级太高而且无法用括号修改。

答案 1 :(得分:0)

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

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

实施例

我需要搜索prod_name& prod_short_desc列,因此我在数据库中创建了一个名为data的列,并附加了prod_name&的值。 prod_short_desc然后只查看data字段就像魅力一样

prod_name |的 prod_short_desc

samsung  | samsung s5

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

数据

samsung samsung s5

然后通过以下查询确实搜索非常快,

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