【问题标题】:Best way for search word in 150k words dictionnary in a iphone app?在 iphone 应用程序中的 150k 单词词典中搜索单词的最佳方式?
【发布时间】:2010-07-15 12:53:26
【问题描述】:

我正在开发一个简单的法语词典单词应用程序,其中包含 15 万个单词和定义。 我正在寻找最好的方法来做到这一点。

首先我使用 150k 字的 sqlite bdd。 我使用 LIKE 命令进行单词搜索,但速度很慢 例如:SELECT * FROM words WHERE word LIKE '%avoi%' LIMIT 0,50; 用于搜索包含 'avoi' 的单词,例如 'avoir' 或 'savoir'。 我的表有单词列索引,但 LIKE 不使用索引,所以它在 3GS 上非常慢(2-5)。

在我使用 fts3 扩展关闭 sqlite 以使用 MATCH 命令后 例如:SELECT * FROM words WHERE word MATCH 'avoi*' LIMIT 0,50; 在 3GS 上要好得多(0,1-0,15s),但它只搜索以 'avoi' 开头的单词,如 'savoir' 不在结果中。 MATCH 命令不适用于 'avoi'

之类的语法

您对优化此文本搜索有什么想法吗?

我有一个非常好的 iphone 应用程序示例:Dixel (Robert Disctionnary),他使这种搜索速度非常快。对该方法有什么想法吗?

感谢您的回答。

【问题讨论】:

  • 我打算建议尝试prefix tree, or trie,但这不会帮助您处理包含子字符串的单词而不是单词的开头......

标签: iphone iphone-sdk-3.0 sqlite


【解决方案1】:

快速词典使用复杂的数据结构来限制暴力搜索。有很多关于单词的数据可以快速存储和搜索

一种这样的数据结构只是基于单词包含的字母之间的关系对单词进行排序。例如。您有一个表格,其中列出了a 后跟v 的所有单词。然后另一个用于所有具有v 后跟o 的单词。搜索任意字符串avothen 变成了将表与有序 AND 合并的问题。所以:

(all words in which `a` is followed by a `v`) AND (all words in which `v` followed by an `o`)

一旦你得到所有匹配的单词表都有必要的模式,你可以快速暴力破解它。

字典就像日期和时间,它们看起来很简单,因为我们已经习惯了它们,但在计算机上运行它们所需的幕后代码却看似复杂。

【讨论】:

  • 感谢您的回答...我毫不怀疑为此类搜索建模 bdd 的难度。我正在尝试将索引词放入 NSArray... 搜索变得更快(大约 0.5 秒),但我认为这不是一个好方法(NSArray 的 3 Mo 内存...)。你有一些好的链接或好的阅读可以帮助我吗?我有点失落,我不知道在哪里和谁搜索...谢谢
  • 我没有任何链接。这是一种专门的东西,通用数据结构是一个很大的话题。我建议查看一些随处可见的开源词典。看看他们是如何处理这个问题的。我可以告诉您,您将不得不对数据库进行大量处理,以便以六种方式将其索引到周日。
猜你喜欢
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多