【问题标题】:Optimizing SQLite multiple LIKE search for iOS为 iOS 优化 SQLite 多 LIKE 搜索
【发布时间】:2011-06-09 03:01:47
【问题描述】:

我正在 iPhone 应用程序中执行带有多个 LIKE 子句的 SQLite 选择语句。语句类似于以下内容:

SELECT * FROM mytable 
WHERE name LIKE 'Smith %' 
OR name LIKE '% Smith %' 
OR name LIKE 'Smith_%' 
OR name LIKE '% Smith_%';

目前在我的笔记本电脑上执行大约需要 0.5 秒,在设备上大约需要 2 秒。由于空间限制,我无法索引“mytable”的“name”列。

每个 LIKE 子句都非常相似 - 如果一个失败,很可能它们每个都会失败。因此,我想将这些组合在一起一些如何优化我的搜索。

这可以通过 REGEXP 来实现吗?如果是,那么 REGEXP 是如何以及默认启用的?

编辑。我正在尝试以下语句:

SELECT * FROM mytable WHERE name REGEXP '[ _]?Smith[ _,]';

【问题讨论】:

  • 我认为您对 REGEXP 的看法是正确的... SQLite 默认情况下不提供它的实现,所以它只有在您为其编写用户函数时才会存在(或者如果有一个在它的 iOS 实现中提供)。而且,不幸的是,我能想到的唯一优化将依赖于被索引的列。
  • @All:我在这方面取得了一些进展,事实上一直到现在。如果有兴趣我会在这里发帖。一件事 - 从regex.h 调用regcomp 来生成内部正则表达式很昂贵(幸运的是regexec 很快)。在我的情况下,内部正则表达式在查询过程中不会改变,所以我在一次 regcomp 调用后缓存它。这会产生 /massive/ 的不同。
  • 索引通常不适用于%...% 构造,因此它很可能不适用于regexp,即使它可用。你被全表扫描困住了。
  • @Blindy:也许吧,虽然 REGEX 现在对我来说很好用,因为我可以放弃 %。我只需要将 4 或 5 个类似的 LIKE 运算符折叠成一个运算符,到目前为止一切顺利。

标签: ios regex sqlite sql-like


【解决方案1】:

SQLite 实际上内置了一个全文搜索引擎。您可以考虑使用它。

http://www.sqlite.org/fts3.html#section_1

【讨论】:

  • 对。这对我的需求来说可能有点过头了,REGEX 似乎工作正常。如果没有,我会前往 FTS3/4。
  • @SK9:我鼓励你尝试 FTS。这太疯狂了。
  • 是否默认启用 FTS?我执行CREATE VIRTUAL TABLE enrondata1 USING fts3(content TEXT); 并尝试用插入填充表,但不行。
  • @SK9 - 最后我知道,默认情况下没有启用它。但是,这很容易解决。 SQLite 是一个可以包含在项目中的源文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 2023-03-29
  • 2012-04-26
  • 1970-01-01
  • 2022-08-11
相关资源
最近更新 更多