SQLite:更有效的查询,用于在多个字段中搜索多个术语

时间:2018-06-09 10:12:10

标签: sql sqlite

我正在使用一个SQLite 3数据库,该数据库必须处理一个相当通用的关键字搜索,搜索几个(确切数目当前未知,但可能是2-5)字段中的给定术语。

举个例子,假设我们有一个包含addChild()Title列的表格,有人会传递搜索字符串Content,然后很容易将其分成三个搜索字词{在开始搜索之前{1}},'foo bar baz'foo

这一切似乎都很简单,直到生成查询。使用一些for循环来生成如下语句相对简单:

bar

并且通常这应该有效,但它似乎是一种非常重复的结构化查询方式,如果有足够的搜索条件和列来检查,则可以轻松实现大小的扩展。

所以我的问题是,是否有更简单的方法来构造这样的语句?

2 个答案:

答案 0 :(得分:1)

为避免编写长查询,您还可以将搜索参数传递到temporary table并在另一个中使用它:

CREATE TEMPORARY TABLE search_terms(keyword text);
INSERT INTO search_terms VALUES ('foo');
INSERT INTO search_terms VALUES ('bar');
INSERT INTO search_terms VALUES ('baz');

SELECT DISTINCT T.title,T.content FROM table T INNER JOIN search_terms ST ON
T.title LIKE '%' || ST.keyword || '%' 
OR T.content LIKE '%' || ST.keyword || '%';

答案 1 :(得分:0)

首先,您可以使用字符串连接稍微简化查询:

WHERE (Title || ' ' || Content) LIKE '%foo%' AND
      (Title || ' ' || Content) LIKE '%bar%' AND
      (Title || ' ' || Content) LIKE '%baz%' 

由于字符串越长,字符串操作越多,性能可能会稍微差一些。但是,表达式更简单,无论如何性能都会很糟糕。

为什么呢?因为您尝试使用SQL原语复制全文搜索。 SQLite具有全文搜索扩展名(请参阅here);这些可能是实现你想要的更好的方法。