SQLite - 如何返回包含包含一个或多个字符串的文本字段的行?

时间:2011-01-06 07:18:33

标签: performance sqlite select sql-like

我需要查询SQLite数据库中的表,以返回表中与给定字组匹配的所有行。

更确切地说:我有一个包含约80,000条记录的数据库。其中一个字段是文本字段,每条记录大约100-200个字。我想要做的是获取200个单词关键字{“apple”,“orange”,“pear”,...}的列表,并检索表中包含至少一个的所有记录的集合在描述列中的关键字术语。

显而易见的方法就是这样:

SELECT stuff FROM table 
WHERE (description LIKE '% apple %') or (description LIKE '% orange %') or ... 

如果我有200个条款,我最终会看到一个看起来很笨拙的SQL语句,在我看来是笨拙的,有些不好的做法,并且不需要花费很长时间来处理 - 每1000条记录超过一秒。

这个答案Better performance for SQLite Select Statement似乎接近我所需要的,因此我创建了一个索引,但根据http://www.sqlite.org/optoverview.html,如果LIKE运算符与一个开头一起使用,sqlite不会使用任何优化%wildcard。

不是SQL专家,我假设我这样做是愚蠢的。我想知道一个有更多经验的人是否可以建议一种更明智,也许更有效的方式来做这件事?

或者,我可以使用更好的方法解决问题吗?

3 个答案:

答案 0 :(得分:2)

使用SQLite fulltext search会比LIKE'%...%'查询更快。我不认为有任何数据库可以使用以%开头的查询的索引,就好像数据库不知道查询的起始,然后它不能使用索引来查找它。

另一种方法是将关键字放在一个单独的表中,并创建一个中间表,其中包含主表中哪一行具有哪些关键字的信息。如果您通过这种方式索引所有相关列,则可以非常快速地查询它。

答案 1 :(得分:0)

这与全文搜索的问题相同,对吧?在这种情况下,如果您希望有效地执行此操作,则需要DB的一些帮助才能在这些字段中构建索引。快速搜索SQLite全文搜索会产生this page

正确识别为笨拙的解决方案可能会在最坏的情况下(即文档不匹配时)每个文档最多执行200个正则表达式匹配,其中每个匹配必须遍历整个字段。使用索引方法意味着您的搜索速度将与每个文档的大小无关。

答案 2 :(得分:0)

听起来你可能想看看Full Text Search。谷歌的某个人为SQLite做出了贡献。说明:

  

允许用户有效地查询   包含所有行的数据库   一个或多个单词(此后   “令牌”),即使表中包含   很多大文件。